2014-02-05 2 views
0

Ниже приведен код, который я использую для отправки информации на сервер в формате JSON.Как разместить объект JSON, который включает изображение на сервер?

NSData *jsonData = [dict dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; 

    NSString *jsonLength = [NSString stringWithFormat:@"%d",[jsonData length]]; 
    //Initiating the request 
    urlRequest = [[NSMutableURLRequest alloc] init]; 
    [urlRequest setURL:url]; 
    [urlRequest setHTTPMethod:@"POST"]; 
    [urlRequest setValue:jsonLength forHTTPHeaderField:@"Content-Length"]; 
    [urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
    //[urlRequest setValue:@"applcation/x-www-form-urlencoded;" forHTTPHeaderField:@"Content-Type"]; 
    [urlRequest setValue:@"applcation/json" forHTTPHeaderField:@"Content-Type"]; 
    [urlRequest setHTTPBody:jsonData]; 

Ниже приведено сообщение.

NSString *urlStg = nil; 
    NSString *dict = [NSString stringWithFormat:@"{\"keyword\":\"%@\",\"email\":\"%@\",\"password\":\"%@\"}",@"login",@"[email protected]",@"2221"]; 

    //Parsing JSON data 

    _LZjsonfetcher = [[JSONFetcher alloc] init]; 

    [_LZjsonfetcher setDelegate:self]; 

    [_LZjsonfetcher postDataParsed:dict url:urlStg delegate:nil key:nil]; 

У меня был успех, связанный с сервером, и возвращение JSON. Но проблема в том, что я не знаю, как отправить изображение на сервер с помощью JSON. Я попытался найти образец без успеха. Не поддерживает ли JSON загрузку изображений? Нужно ли мне найти другой способ загрузить изображение на сервер? Спасибо за помощь.

+0

Посмотрите на NSURLSessionUploadTask. Вот ссылка https://developer.apple.com/library/mac/documentation/cocoa/conceptual/urlloadingsystem/Articles/UsingNSURLSession.html#//apple_ref/doc/uid/TP40013509-SW15 – Jonathan

+0

u не может напрямую храниться изображение на сервер, вам нужно выполнить 3 шага, 1. конвертировать UIImage в NSData 2. Преобразовать NSData в NSString 3. наконец, сохранить строку Значение на сервере, –

+0

, получение также является обратным процессом, k –

ответ

2

Хотя вы могли бы сделать это с помощью предложения здесь, я думаю, стоит взглянуть на структуру AFNetworking, которая упрощает весь сетевой процесс. Используя эту структуру, вот как вы можете отправить JSON с изображением:

AFHTTPRequestOperationManager * manager = [[AFHTTPRequestOperationManager alloc] init]; 
NSData * imageData = UIImageJPEGRepresentation(myImage, 1.0); 
NSDictionary * jsonParameters = @{@"key":@"value"}; 

[manager POST:@"http://myURL.com" parameters:jsonParameters constructingBodyWithBlock:^(id<AFMultipartFormData> formData) { 
    [formData appendPartWithFileData:imageData name:@"attachment" fileName:@"myImage.jpg" mimeType:@"image/jpeg"]; 
    } success:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSLog(@"Success!"); 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
     NSLog(@"Failure!"); 
    }]; 

Каркас является очень гибким и так много больше вы можете сделать с этим - я очень рекомендую его.

+0

привет, спасибо за ваш совет. У меня чужой json, но как я могу использовать ваш метод с этим? вот мой json (включите base64 с ключом внутри): https://pastebin.com/NSRViJ59 – kemdo

+0

@kemdo, если у вас есть действительный объект JSON, который представлен как «NSDictionary», тот же метод должен работать. Обратите внимание, однако, что этот ответ был написан давно и что структура AFNetworking изменилась с тех пор (если вы пишете в Swift, вы должны посмотреть на Alamofire). Кроме того, Apple значительно улучшила свои собственные сетевые библиотеки, поэтому вы можете просто использовать их напрямую. – Gad

1

Используйте кодировку base64, которая преобразует данные в строку, которая будет совместима с json.

UIImage* image = nil; 
NSData* dataImage = UIImagePNGRepresentation(image); 
NSString* base64Image = [dataImage base64EncodedStringWithOptions:0]; 

[dictionary setObject:base64Image forKey:@"image"]; 

Теперь на стороне сервера, вам нужно будет декодировать строку base64 и сохранить его в виде файла изображения, PHP:

$dictionary = NULL; 
$base64_image = $dictionary->image; 
$image = base64_decode($base64_image); 
file_put_contents('/image.png', $image); 
+0

Я попытался кодировать base64, но после преобразования и публикации сервера. json sent не работает, значит, если я удалю данные изображения, чтобы опубликовать их, он вернется для успеха. – Lazarus

+0

@ Lazarus, насколько большой запрос http с изображением? Возможно, это превысило ограничение на размер загружаемого вами сервера. – SomeGuy

Смежные вопросы