1

Я пытаюсь отправить UIImage взять с UIImagePickerController на сервер POST вместе с другими соответствующими значениями. Но я получаю на линии, которая пытается установить словарь значение @ «изображение» в UIImageJPEGRepresentation (изображение, 1.0):Отправить UIImage POST на сервер от UIImagePickerController?

-(void)sendImageToServer:(UIImage *)image 
{ 
    NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
    queue.maxConcurrentOperationCount = 4; 

    NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration ephemeralSessionConfiguration] delegate:nil delegateQueue:queue]; 
    NSURL *uploadURL = [NSURL URLWithString:@"http://...."]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:uploadURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:30.0]; 

    [request addValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

    [request setHTTPMethod:@"POST"]; 

    NSData *postData = [[NSData alloc] init]; 
    [postData setValue:UIImageJPEGRepresentation(image, 1.0) forKey:@"image"]; 
    [postData setValue:@"1" forKey:@"categories[0]"]; 
    [postData setValue:@"4" forKey:@"categories[1]"]; 

    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request 
                   fromData:postData 
                 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

     if (!error) { 
      NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse *)response; 
      if (httpResponse.statusCode == 200) { 
       dispatch_async(dispatch_get_main_queue(), ^{ 
        NSError *err; 
        NSDictionary *JSONDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&err]; 
        NSLog(@"HTTP 200 response: %@", JSONDict); 
       }); 
      } else {  
       NSLog(@"HTTP %ld status!", (long)httpResponse.statusCode); 
      } 
     } else { 
      NSLog(@"HTTP post image error: %@", error); 
     } 
    }]; 
    [uploadTask resume]; 
} 

JSON сериализации не работает здесь, потому что изображения не являются допустимыми значениями JSON. Если, с другой стороны, я стараюсь:

... 
NSMutableData *postData = [[NSMutableData alloc] init]; 
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:postData]; 

    [archiver encodeObject:UIImageJPEGRepresentation(image, 1.0) forKey:@"image"]; 
    [archiver encodeObject:@"1" forKey:@"categories[0]"]; 
    [archiver encodeObject:@"4" forKey:@"categories[1]"]; 
    [archiver finishEncoding]; 



    //NSData *postData = [NSJSONSerialization dataWithJSONObject:dataDict options:NSJSONWritingPrettyPrinted error:&jsonError]; 
    //Now you can post the json data 

    NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request 
                   fromData:postData 
                 completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {... 

Ключ: пары значений, архивированные, похоже, не попадают на сервер как таковой. Это должно быть обычной задачей кодирования iOS.

Даже если я просто попробовать:

NSError *jsonError; 
    NSData *postData = [NSJSONSerialization dataWithJSONObject:@{@"image":@"123",@"categories[0]":@"1",@"categories[1]":@"4"} options:NSJSONWritingPrettyPrinted error:&jsonError]; 

Сервер не получает ключи на всех ...

+0

NSData * ImageData = UIImageJPEGRepresentation (изображение, 1,0); попробуйте это –

+0

вам лучше ASIHTTPREQUEST или AFNETWORKING libs. –

ответ

0

Это не правильное использование NSData. Это сбой прямо сейчас, потому что NSData не имеет ключевого имени изображения (..или другие два после этого). Что вам нужно сделать, это создать NSDictionary, а затем преобразовать его в NSData.

ли что-нибудь подобное вместо:

NSDictionary *dictionary = [NSDictionary alloc]initWithObjectsAndKeys:image,@"image",@(1),@"categories[0]",@(4),@"categories[1]", nil]; 
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dictionary]; //Not currently using NSJSONSerialization since you want to post a Dictionary with an invalid NSJSONSerialization type in it. 
//Now you can post the json data 
+0

Спасибо @tdevoy. Я уже пробовал что-то подобное, но оно бросает и исключение в одном и том же месте: \t \t \t \t \t [NSJSONSerialization datataWithJSONObject ....]; Я предположил, что представление JPEG не является допустимым значением JSON: NSDictionary * dataDict = @ {@ "image": UIImageJPEGRepresentation (image, 1.0), @ "categories [0]": @ "1", @ "categories [1] ": @" 4 "}; NSError * jsonError = nil; NSData * postData = [NSJSONSerialization dataWithJSONObject: dataDict options: NSJSONWritingPrettyPrinted error: & jsonError]; – izk

+0

Да, крик забыл, что методы NSJSONSerialization работают только с объектами NSString, NSNull, NSNumber, NSArray и NSDictionary. Вы можете использовать NSKeyedArchiver для преобразования в NSData. –

0

Дайте попробовать с AFNetworking, то есть отличный способ сделать загрузку, вы можете найти образцы здесь: https://github.com/AFNetworking/AFNetworking#creating-an-upload-task

Я лично рекомендую всем использовать это, поскольку я начал использовать, у меня не было никаких проблем с сообщением моих приложений с веб-серверами.

0

Использование AFNetworking и многочастного сообщения формы. Вот грубый пример (обратите внимание, я передаю в блоке так что ваша реализация будет меняться):

AFHTTPRequestOperation *operation = [self POST:FullURLString parameters:Params constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
     [formData appendPartWithFileData:fileData name:fileName fileName:fileName mimeType:mimeType]; 
    } success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSData *responseData = [operation responseData]; 
     id retObj; 
     NSError *error = nil; 
     if (responseData) { 
      retObj = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 
     } 
     // Pass back the serialized object (either an NSArray of type NSDictionaries or an NSArray of type customClass) 
     block(retObj); 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Failed with error = [Error]: %@", error); 
     block(nil); 
}]; 
Смежные вопросы