title: Multipart/Formdata image upload, get the file
body: <p>in my app i want to upload an image chosen via <code>UIImagePickerController</code> to a database which only accepts JPEG images. I've browsed many questions in here, and in other forums but i still didn't get it to work. I hope you can check my code, if there is a mistake which i can't see.
  This is the complete method for uploading, with an image description, an image title, and the geodata for this image:</p>
  
  <pre><code>- (void) uploadPic{
      NSArray  *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *documentsDirectory = [paths objectAtIndex:0];
      NSString *destinationFilePath = [[NSString alloc] initWithFormat: @"%@/%@.jpeg", documentsDirectory, self.chosenImage.imgTitle];
      NSURL *fileURL = [[NSURL alloc]initWithString:destinationFilePath];
      NSLog(@"will upload file: %@", destinationFilePath);
  
      NSData *imageURLdata = [[NSData alloc]initWithContentsOfURL:fileURL];   (*1) 
      NSData *imageData = UIImageJPEGRepresentation(self.chosenImage, 90);    (*2) 
      //Here i tried 2 ways of getting the data for uploading, but both don't work.
  
      // create the URL
      NSURL *postURL = [NSURL URLWithString:@"http://*********/PictureUpload"];
  
      // create the connection
      NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:postURL cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:20.0];
  
      // change type to POST (default is GET)
      [postRequest setHTTPMethod:@"POST"];
  
      // just some random text that will never occur in the body
      NSString *stringBoundary = @"0xKhTmLbOuNdArY---This_Is_ThE_BoUnDaRyy---pqo";
  
      // header value, user session ID added
      NSString *headerBoundary = [NSString stringWithFormat:@"multipart/form-data; boundary=%@",
                                  sessionID];
  
      // set header
      [postRequest addValue:headerBoundary forHTTPHeaderField:@"Content-Type"];
      // create data
      NSMutableData *postBody = [NSMutableData data];
  
      // title part
      [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"title\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[self.chosenImage.imgTitle dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
  
      // desc part
      [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"desc\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[self.chosenImage.imgDescription dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
  
  
      // latitude part
      [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"latitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[self.chosenImage.latitude dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
  
      // longitude part
      [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[[NSString stringWithString:@"Content-Disposition: form-data; name=\"longitude\"\r\n\r\n"] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[self.chosenImage.longitude dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[@"\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
  
      // media part
      [postBody appendData:[[NSString stringWithFormat:@"--%@\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[[NSString stringWithFormat:@"Content-Disposition: form-data; name=\"file\"; filename=\"%@.jpeg\"\r\n", self.chosenImage.imgTitle ] dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[@"Content-Type: image/jpeg\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
      [postBody appendData:[NSData dataWithData:imageURLdata]];
      [postBody appendData:[@"Content-Transfer-Encoding: binary\r\n\r\n" dataUsingEncoding:NSUTF8StringEncoding]];
  
      // final boundary
      [postBody appendData:[[NSString stringWithFormat:@"--%@--\r\n", stringBoundary] dataUsingEncoding:NSUTF8StringEncoding]];
      NSString *s = [[NSString alloc] initWithData:postBody encoding:NSASCIIStringEncoding];
      NSLog(@"%@", s);
  
      // add body to post
      [postRequest setHTTPBody:postBody];
  
      // pointers to some necessary objects
      NSURLResponse* response;
      NSError* error;
  
      // synchronous filling of data from HTTP POST response
      NSData *responseData = [NSURLConnection sendSynchronousRequest:postRequest returningResponse:&amp;response error:&amp;error];
  
      if (error)
      {
          NSLog(@"Error: %@", [error localizedDescription]);
      }
  
      // convert data into string
      NSString *responseString = [[NSString alloc] initWithBytes:[responseData bytes]
                                                          length:[responseData length]
                                                        encoding:NSUTF8StringEncoding];
  
      // see if we get a welcome result
      NSLog(@"%@", responseString);
      [self responseHandler:responseString];
  
  }
  </code></pre>
  
  <p>The <code>GEOimage</code> <code>chosenImage</code> is created via the <code>CGImageRef</code> after an <code>UIImage</code> is chosen in the <code>ImagePickerController</code>. 
  Method nr. *1 to get the <code>NSData</code> for upload is not the best, because here the image is chosen from the document directory, and here every EXIF information about the image is deleted.
  With both methods i get the response from the database that the image filetype is not supported (JPEG expected). 
  I thought with method nr. *2 i'm sending an JPEG image, but perhaps i have a mistake in the whole multipart/formdata process.</p>
  
  <p>I tried to get the URL to the original file on the filesystem, but this is quite difficult for me. I only got the assets-url from the image.</p>
  
  <p>Thanks in advance</p>
  
  <p>S4lfish</p>