Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Upload image with multipart form-data iOS in Swift

i am having a problem with uploading image with multipart-form

here is my code i used from this answer

    var request = NSMutableURLRequest(URL: url!)     request.HTTPMethod = "POST"      var boundary = generateBoundaryString()     request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")      var body = NSMutableData()      if self.img.image != nil {         var imageData = UIImagePNGRepresentation(self.img.image)          if imageData != nil {             body.appendString("--\(boundary)\r\n")             body.appendString("Content-Disposition: form-data; name=\"image\"; filename=\"image.png\"\r\n")             body.appendString("Content-Type: image/png\r\n\r\n")             body.appendData(imageData!)             body.appendString("\r\n")         }      }      body.appendString("--\(boundary)--\r\n")     request.setValue("\(body.length)", forHTTPHeaderField:"Content-Length")     request.HTTPBody = body 

then i use NSURLSession to apply the request

the server says that i didn't choose image to upload i only want to upload the image for now

do i have to use paths of images to upload any image or it's data is enough?

do i miss any thing , any help to understand this ?

like image 210
Amr Mohamed Avatar asked Apr 14 '15 09:04

Amr Mohamed


1 Answers

My version that 100% works. Maybe it will help you.

let url = "http://server/upload" let img = UIImage(contentsOfFile: fullPath) let data: NSData = UIImageJPEGRepresentation(img, 1)  sendFile(url,      fileName:"one.jpg",      data:data,      completionHandler: completionHandler:{         (result:Bool, isNoInternetConnection:Bool) -> Void in              // ...                  NSLog("Complete: \(result)")     } )   func sendFile(     urlPath:String,     fileName:String,     data:NSData,     completionHandler: (NSURLResponse!, NSData!, NSError!) -> Void){                  var url: NSURL = NSURL(string: urlPath)!         var request1: NSMutableURLRequest = NSMutableURLRequest(URL: url)                  request1.HTTPMethod = "POST"                  let boundary = generateBoundary()         let fullData = photoDataToFormData(data,boundary:boundary,fileName:fileName)                  request1.setValue("multipart/form-data; boundary=" + boundary,             forHTTPHeaderField: "Content-Type")                  // REQUIRED!         request1.setValue(String(fullData.length), forHTTPHeaderField: "Content-Length")                  request1.HTTPBody = fullData         request1.HTTPShouldHandleCookies = false                  let queue:NSOperationQueue = NSOperationQueue()                  NSURLConnection.sendAsynchronousRequest(             request1,             queue: queue,             completionHandler:completionHandler) }  // this is a very verbose version of that function // you can shorten it, but i left it as-is for clarity // and as an example func photoDataToFormData(data:NSData,boundary:String,fileName:String) -> NSData {     var fullData = NSMutableData()          // 1 - Boundary should start with --     let lineOne = "--" + boundary + "\r\n"     fullData.appendData(lineOne.dataUsingEncoding(         NSUTF8StringEncoding,         allowLossyConversion: false)!)          // 2     let lineTwo = "Content-Disposition: form-data; name=\"image\"; filename=\"" + fileName + "\"\r\n"     NSLog(lineTwo)     fullData.appendData(lineTwo.dataUsingEncoding(         NSUTF8StringEncoding,         allowLossyConversion: false)!)          // 3     let lineThree = "Content-Type: image/jpeg\r\n\r\n"     fullData.appendData(lineThree.dataUsingEncoding(         NSUTF8StringEncoding,         allowLossyConversion: false)!)          // 4     fullData.appendData(data)          // 5     let lineFive = "\r\n"     fullData.appendData(lineFive.dataUsingEncoding(         NSUTF8StringEncoding,         allowLossyConversion: false)!)          // 6 - The end. Notice -- at the start and at the end     let lineSix = "--" + boundary + "--\r\n"     fullData.appendData(lineSix.dataUsingEncoding(         NSUTF8StringEncoding,         allowLossyConversion: false)!)          return fullData } 
like image 198
Anthony Akentiev Avatar answered Sep 21 '22 19:09

Anthony Akentiev