Загрузка изображения из UIImage в формате JPEG вместе с другими POST-данными - PullRequest
4 голосов
/ 27 декабря 2010

Я делаю веб-сервис и приложение для iOS, используя этот веб-сервис.API веб-сервиса принимает HTTP-запрос POST с двумя POST-переменными:

  1. picture[title] заголовок изображения
  2. picture[picture] данные самого изображения

Теперь с HTML это не проблема, поскольку веб-браузер создает запрос, и единственное, о чем мне нужно беспокоиться, это enctype="multipart/form-data".

Но с приложением для iOS у меня две проблемы, вместес двумя вопросами, которые я собираюсь задать прямо сейчас.

  1. Как преобразовать UIImage из средства выбора изображений или камеры в необработанные JPEG-данные?
  2. Как сделать NSURLRequest с помощьюправильные POST-данные, которые должны содержать поле picture[title] в виде простого текста и поле picture[picture] с данными JPEG?На стороне сервера я использую гем Paperclip, сравнимый с PHP $_FILES.

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

Кто-нибудь может мне помочь?Спасибо.

1 Ответ

4 голосов
/ 23 июня 2011

Ознакомьтесь с этим уроком, который довольно хорош:

http://iphone.zcentric.com/2008/08/29/post-a-uiimage-to-the-web/

Одна вещь, которая не совсем верна, это то, что она передает значение 90 в качестве параметра качества для UIImageJPEGRepresentation, который фактически принимает качество в виде числа с плавающей точкой между 0,0 и 1,0, так что вместо этого оно должно быть 0,9. Я уверен, что код работает, он просто указывает на 100% качества, а не на 90%, как предполагалось. И, просто для удобства и в случае разрыва ссылки, вот соответствующий код (переработанный для ясности и лучшего соответствия вопросу):

- (void)uploadImage:(UIImage *)image toURL:(NSURL *)url withTitle:(NSString *)title {

  // encode the image as JPEG
  NSData *imageData = UIImageJPEGRepresentation(image, 0.9);

  // set up the request
  NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
  [request setURL:url];

  // create a boundary to delineate the file
  NSString *boundary = @"14737809831466499882746641449";
  // tell the server what to expect
  NSString *contentType = 
    [NSString stringWithFormat:@"multipart/form-data; boundary=%@", boundary];
  [request addValue:contentType forHTTPHeaderField: @"Content-Type"];

  // make a buffer for the post body
  NSMutableData *body = [NSMutableData data];

  // add a boundary to show where the title starts
  [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] 
    dataUsingEncoding:NSASCIIStringEncoding]];

  // add the title
  [body appendData:[
    @"Content-Disposition: form-data; name=\"title\"\r\n\r\n"
    dataUsingEncoding:NSASCIIStringEncoding]];
  [body appendData:[title
    dataUsingEncoding:NSASCIIStringEncoding]];

  // add a boundary to show where the file starts
  [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n", boundary] 
    dataUsingEncoding:NSASCIIStringEncoding]];

  // add a form field
  [body appendData:[
    @"Content-Disposition: form-data; name=\"picture\"; filename=\"image.jpeg\"\r\n"
    dataUsingEncoding:NSASCIIStringEncoding]];

  // tell the server to expect some binary
  [body appendData:[
    @"Content-Type: application/octet-stream\r\n"
    dataUsingEncoding:NSASCIIStringEncoding]];
  [body appendData:[
    @"Content-Transfer-Encoding: binary\r\n"
    dataUsingEncoding:NSASCIIStringEncoding]];
  [body appendData:[[NSString stringWithFormat:
    @"Content-Length: %i\r\n\r\n", imageData.length]
    dataUsingEncoding:NSASCIIStringEncoding]];

  // add the payload
  [body appendData:[NSData dataWithData:imageData]];

  // tell the server the payload has ended
  [body appendData:
    [[NSString stringWithFormat:@"\r\n--%@--\r\n", boundary] 
    dataUsingEncoding:NSASCIIStringEncoding]];

  // add the POST data as the request body
  [request setHTTPMethod:@"POST"];
  [request setHTTPBody:body];

  // now lets make the connection to the web
  NSData *returnData = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
  NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding];

  NSLog(@"%@", returnString);
}

На самом деле я не скомпилировал его так, как здесь написано, поэтому, возможно, он содержит некоторые проблемы.

В PHP вы должны видеть, что установлены $ _REQUEST ['title'] и $ _FILES ['picture'].

...