Цель c - Отправить изображение через HTTP POST

Я пытаюсь понять, как отправить изображение с помощью http POST и моего текущего дизайна протокола клиент-сервер. Все сообщения от клиента к серверу выглядят как в примере ниже, есть строка cmd с параметромcmd и некоторые более важные параметры для команды.

Например, вот как я отправляю текстовое сообщение на сервер:

- (void)sendMessagesWithText:(NSString *)text fromUser:(NSString *)userId
{
    NSString *url = SERVER_URL;

    NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
    [request setURL:[NSURL URLWithString:url]];
    [request setHTTPMethod:@"POST"];

    NSMutableData *body = [NSMutableData data];

    [body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", 
                       @"sendmessage", 
                       userId,
                       text] dataUsingEncoding:NSUTF8StringEncoding]];


    [request setHTTPBody:body];

    // send to server
    [[NetworkHelper sharedManager] sendRequest:request]; 
}

Теперь я хочу, чтобы пользователь также мог отправить изображение, но как мне отправить его с моим дизайном протокола? я должен просто добавить изображение к телу после строки CMD?

Ответы на вопрос(2)

Решение Вопроса

Вот пример из ныне несуществующей ASI:Создание и запуск запросов

Sending a form POST with ASIFormDataRequest

To send POST data in a manner compatible with web page forms, use the included ASIFormDataRequest subclass. Data is posted in ‘application/x-www-form-urlencoded’ format, or ‘multipart/form-data’ format when uploading binary data or files. Data in files is read as needed from disk, so POSTing large files is OK, as long as your web server is setup to handle them.

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
[request setPostValue:@"Ben" forKey:@"first_name"];
[request setPostValue:@"Copsey" forKey:@"last_name"];
[request setFile:@"/Users/ben/Desktop/ben.jpg" forKey:@"photo"];

ASIFormDataRequest will autodetect the mime type of files (on iOS 3.0 or later an Mac) added to the POST via setFile:forKey:, and include this in the mime headers sent to the server. If you prefer, you can use the longer form to override this:

Multipart / форм-данных, отстой. Поверьте мне, я реализовал это на C ++ несколько лет назад. Заставь кого-нибудь сделать грязную работу.

Но если вы все еще хотите пойти в одиночку. я нашелэтот а такжеэтот, Удачи.

 30 мая 2012 г., 00:50
ASIHTTPRequest - это потрясающая библиотека.
 30 мая 2012 г., 13:58
Я писал инструмент общего назначения, который мог отправлять любой контент на любой HTTP-сервер, поэтому мне приходилось сталкиваться с множеством нюансов. Серверы были разборчивы и не выдавали хороших сообщений об ошибках. Возможно, вам будет легче.
 Eyal30 мая 2012 г., 08:49
@ Jeffery Я не понимаю, вы говорите, что делать это в одиночку - отстой, но кажется, что мне просто нужно добавить некоторые поля в мое тело http. Я что-то пропустил? Есть ли еще работа по работе с Multipart / form-data?
 Eyal30 мая 2012 г., 01:03
Я предпочитаю не использовать библиотеку только для этого одного метода. Можете ли вы сказать мне, как сделать это сам?
 30 мая 2012 г., 03:26
Я обновил свой ответ. Я надеюсь, что это предупредит вас от попыток.

[body appendData:[[NSString stringWithFormat:@"cmd=%@&userid=%@&msgtext=%@", @"sendmessage&image=", userId, text] dataUsingEncoding:NSUTF8StringEncoding]];

[body appendData: UIImagePNGRepresentation((UIImage *) myImage)];

Тем не менее, может быть проще заглянуть вASIHTTPRequestс этим, вы можете просто использовать:

[request setPostValue:myImageData forKey:@"image"];
 17 февр. 2015 г., 08:01
Чтобы другие бились головой об стену, нужно сначала спросить сервера, что требуется. В моем случае для завершения работы сервера требовался обычный файл, поэтому [body appendData: UIImagePNGRepresentation ((UIImage *) myImage)]; работает нормально, но в некоторых случаях требуется многочастный запрос. Я провел весь вечер, но у меня ничего не получилось, потому что я использовал многокомпонентный запрос, но мне требовался обычный appednData. дух!

Ваш ответ на вопрос