将UIImage中的图像与其他POST数据一起以JPEG格式上传

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

  1. picture[title]的标题
  2. picture[picture]图片数据本身

现在用HTML这不是一个问题,因为Web浏览器构造请求,唯一我担心的是enctype="multipart/form-data"

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

  1. 如何将图像select器或相机的UIImage转换为原始JPEG数据?
  2. 如何使用正确的POST数据来创buildNSURLRequest,它必须包含picture[title] -field作为纯文本, picture[picture]字段包含JPEG数据? 在服务器端,我使用Paperclip gem,与PHP的$_FILES相媲美。

我已经看到了一些上传图片的例子,但是这只包含了图片,而不是其他的POSTvariables。

谁能帮我? 谢谢。

看看这个教程,这很不错:

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']。