Download JPEG image from UIImage along with other POST data

I am making a web service and an iOS application using this web service. The web service API accepts an HTTP POST request with two POST variables:

  • picture[title] image title
  • picture[picture] image data itself

Now this is not a problem with HTML, as the web browser constructs the request, and the only thing I have to worry about is enctype="multipart/form-data" .

But with the iOS app, I have two problems, along with two questions that I am asking right now.

  • How to convert a UIImage from an image picker or camera to raw JPEG data?
  • How to make NSURLRequest the correct POST data that should contain the picture[title] field as plain text and the picture[picture] field with JPEG data? On the server side, I use the Paperclip gem, comparable to PHP $_FILES .

I have seen several examples of loading an image, but this includes only the image, not the other POST variables.

Can anyone help me? Thanks.

+4
source share
1 answer

Check out this tutorial, which is pretty nice:

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

One thing that is not entirely correct is that it passes 90 as a quality setting in the UIImageJPEGRepresentation, which actually takes quality as a float between 0.0 and 1.0, so it should be 0.9 instead. I'm sure the code works, it just sets 100% quality instead of 90% as intended. And, just for convenience and in case the connection is broken, here is the corresponding code (reorganized for clarity and better fit to the question):

 - (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); } 

I did not actually compile it as he wrote here, so it probably contains some problems.

In PHP you should see that $ _REQUEST ['title'] and $ _FILES ['picture'] are set.

+4
source

Source: https://habr.com/ru/post/1333496/


All Articles