How to upload photos from iOS to a REST API

Using a multi-part form POST to send image data

By  

There are a few ways to accomplish posting a photo from an iPhone or iPad to a REST API but the method I’ve found to be the most useful is to create a multi-part form request for the task.

It would be nice to just send the byte stream up on its own, but typically you need to attach some other models or data to the request so that you know what context to place the image into on the server. Borrowing from good old HTML Forms, this method will allow you to submit a whole bunch of data in a variety of formats in a single shot.

As well as this works, there is something unpleasant about generating a multi-part form request for iOS. It’s a specific structure like any other data format, but it’s got some peculiarities that make it feel...hackish. Here is an example of a multi-part form request so you can see what will ultimately be generated:

POST /path/to/script.php HTTP/1.0
Host: example.com
Content-type: multipart/form-data, boundary=AaB03x
Content-Length: $requestlen

--AaB03x
content-disposition: form-data; name="field1"

$field1
--AaB03x
content-disposition: form-data; name="field2"

$field2
--AaB03x
content-disposition: form-data; name="userfile"; filename="$filename"
Content-Type: $mimetype
Content-Transfer-Encoding: binary


$binarydata
--AaB03x--

The boundary string is a unique string that will not appear in your data and will be used to separate out the different parts of your request. You can see how --AaB03x is used to indicate the start of a new form part and --AaB03x-- is used to signal the end of the request. Your image(s) will reside where the $binarydata placeholder is.

Without further ado, here is the sample Objective-C code to accomplish this for iOS 5+.

It doesn't look like the embed code is working at the moment so here is the Gist link.

What you do with the POST on the server side depends on how your API is built, but generally you’ll read in the bytestream and parse out the different form parts using the name=key you've assigned.

Join us:
Facebook

Twitter

Pinterest

Tumblr

LinkedIn

Google+

Answers - Powered by ITworld

ITworld Answers helps you solve problems and share expertise. Ask a question or take a crack at answering the new questions below.

Join us:
Facebook

Twitter

Pinterest

Tumblr

LinkedIn

Google+

Ask a Question