title: NSData and Uploading Images via POST in iOS
body: <p>I have been combing through the many many posts about uploading images via POST in iOS. Despite the wealth of information on this topic, I cannot manage to correctly upload JPEG data taken from my iPhone Simulator Photo Library.
  The data, once on the server, is just a huge string of hexidecimal. Shouldn't NSData just be a byte stream? I don't get whats going on with all the hex, or why this code seems to work for everyone else.</p>
  
  <p>Here is the code in question:</p>
  
  <pre><code>-(void)uploadWithUserLocationString:(NSString*)userLocation{
  NSString *urlString = @"http://some.url.com/post";
  
  // set up the form keys and values (revise using 1 NSDictionary at some point - neater than 2 arrays)
  NSArray *keys = [[NSArray alloc] initWithObjects:@"auth",@"text",@"location",nil];
  NSArray *vals = [[NSArray alloc] initWithObjects:self.authToken,self.textBox.text,userLocation,nil];
  
  // set up the request object
  NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
  [request setURL:[NSURL URLWithString:urlString]];
  [request setHTTPMethod:@"POST"];
  
  //Add content-type to Header. Need to use a string boundary for data uploading.
  NSString *boundary = [NSString stringWithString:@"0xKhTmLbOuNdArY"];
  NSString *contentType = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",boundary];
  [request addValue:contentType forHTTPHeaderField: @"Content-Type"];
  
  //create the post body
  NSMutableData *body = [NSMutableData data];
  [body appendData:[[NSString stringWithFormat:@"--%@\r\n",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
  
  //add (key,value) pairs (no idea why all the \r's and \n's are necessary ... but everyone seems to have them)
  for (int i=0; i&lt;[keys count]; i++) {
      [body appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"%@\"\r\n\r\n",[keys objectAtIndex:i]] dataUsingEncoding:NSASCIIStringEncoding]];
      [body appendData:[[NSString stringWithFormat:@"%@",[vals objectAtIndex:i]] dataUsingEncoding:NSASCIIStringEncoding]];
      [body appendData:[[NSString stringWithFormat:@"\r\n--%@\r\n",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
  }
  [body appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"image\"\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
  [body appendData:[[NSString stringWithString:@"Content-Type: application/octet-stream\r\n\r\n"] dataUsingEncoding:NSASCIIStringEncoding]];
  [body appendData:[NSData dataWithData:self.imageData]];
  [body appendData:[[NSString stringWithFormat:@"\r\n--%@--\r\n",boundary] dataUsingEncoding:NSASCIIStringEncoding]];
  
  // set the body of the post to the reqeust
  [request setHTTPBody:body];
  
  // 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);
  [keys release];
  [vals release];
  }
  </code></pre>
  
  <p>Thanks for your time.</p>