将图像从UIImage上载为JPEG以及其他POST数据

时间:2010-12-27 19:42:19

标签: ios objective-c http post upload

我正在使用此网络服务制作网络服务和iOS应用。 Web服务的API接受带有两个POST变量的HTTP POST请求:

  1. picture[title]图片标题
  2. picture[picture]图片数据本身
  3. 现在使用HTML这不是问题,因为Web浏览器构造了请求,我唯一需要担心的是enctype="multipart/form-data"

    但是对于iOS应用程序,我有两个问题,以及我现在要问的两个问题。

    1. 如何将UIImage从图像选择器或相机转换为原始JPEG数据?
    2. 如何使用正确的POST数据创建NSURLRequest,其中必须包含picture[title] - 字段作为纯文本,picture[picture]字段包含JPEG数据?在服务器端,我使用Paperclip gem,与PHP的$_FILES
    3. 相当

      我看过一些上传图片的例子,但这只包括图片,而不是其他的POST变量。

      任何人都可以帮助我吗?感谢。

1 个答案:

答案 0 :(得分:4)

查看本教程,这非常好:

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']已设置。