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 ?
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 }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With