una titletextattributes subir color bar app aplicacion ios image swift file-upload multipartform-data

titletextattributes - Subir imagen con iOS de datos de formulario multiparte en Swift



titletextattributes swift 4 (5)

Lo primero que noté es la application/octet-stream como Conten-Type , esto generalmente se usa cuando se desconoce el tipo de archivo. Algunos marcos / bibliotecas web rechazarán este tipo de contenido si se requiere una imagen.

En segundo lugar, no puedo ver la longitud de la publicación en ningún lado, intente agregarla:

body.appendString("--/(boundary)--/r/n") // set the content-length request.setValue("/(body.length)", forHTTPHeaderField:"Content-Length")

Tengo un problema con la carga de imágenes con formato multiparte

aquí está mi código que usé de esta 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

entonces uso NSURLSession para aplicar la solicitud

el servidor dice que no elegí la imagen para cargar, solo quiero cargar la imagen por ahora

¿Tengo que usar rutas de imágenes para cargar cualquier imagen o sus datos son suficientes?

¿extraño algo, alguna ayuda para entender esto?


Mi versión que funciona al 100%. Quizás te ayude.

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/jpg/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 }


Implementé Subir imagen usando Multi-part en Swift 4:

Aquí está el código. Por favor échale un vistazo

//MARK: Uplaod User Profile Pic func uploadImageToServerFromApp(nameOfApi : NSString, parameters : NSString, uploadedImage : UIImage, withCurrentTask :RequestType, andDelegate :AnyObject)->Void { if self.isConnectedToNetwork(){ currentTask = withCurrentTask let myRequestUrl = NSString(format: "%@%@%@",GlobalConstants.KBaseURL,nameOfApi,parameters) let url = (myRequestUrl.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed))! var request : NSMutableURLRequest = NSMutableURLRequest() request = URLRequest(url: URL(string:url as String)!) as! NSMutableURLRequest request.httpMethod = "POST" let boundary = generateBoundaryString() //define the multipart request type request.setValue("multipart/form-data; boundary=/(boundary)", forHTTPHeaderField: "Content-Type") let image_data = UIImagePNGRepresentation(uploadedImage) if(image_data == nil){ return } let body = NSMutableData() let fname = "image.png" let mimetype = "image/png" //define the data post parameter body.append("--/(boundary)/r/n".data(using: String.Encoding.utf8)!) body.append("Content-Disposition:form-data; name=/"image/"/r/n/r/n".data(using: String.Encoding.utf8)!) body.append("hi/r/n".data(using: String.Encoding.utf8)!) body.append("--/(boundary)/r/n".data(using: String.Encoding.utf8)!) body.append("Content-Disposition:form-data; name=/"image/"; filename=/"/(fname)/"/r/n".data(using: String.Encoding.utf8)!) body.append("Content-Type: /(mimetype)/r/n/r/n".data(using: String.Encoding.utf8)!) body.append(image_data!) body.append("/r/n".data(using: String.Encoding.utf8)!) body.append("--/(boundary)--/r/n".data(using: String.Encoding.utf8)!) request.httpBody = body as Data let session = URLSession.shared let task = session.dataTask(with: request as URLRequest) { (data, response, error) in guard let data = data, error == nil else { // check for fundamental networking error // print("error=/(String(describing: error))") self.showAlertMessage(title: "App name", message: "Server not responding, please try later") return } if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 { // check for http errors // print("statusCode should be 200, but is /(httpStatus.statusCode)") // print("response = /(String(describing: response))") self.delegate?.internetConnectionFailedIssue() }else{ do { self.responseDictionary = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary // self.Responsedata = data as NSData //self.responseDictionary = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! [String: AnyObject] as NSDictionary; self.delegate?.responseReceived() } catch { //print("error serializing JSON: /(error)") } } } task.resume() } else{ // print("Internet Connection not Available!") self.showAlertMessage(title: "App Name", message: "No Internet Connection..") } } func generateBoundaryString() -> String { return "Boundary-/(NSUUID().uuidString)" }


class func postMultiPartdata( postdatadictionary: [AnyHashable: Any], apikey: String, completion: @escaping (Any) -> () ) { if Utils().isConnectedToNetwork() == false { Utils().showMessage("Check internet") return } let strURL = "http://redspark.biz/dropp/api//(apikey)" let url = URL(string: strURL) var urlRequest = URLRequest(url: url!) urlRequest.httpMethod = "POST" let body = NSMutableData(); let boundary = "---------------------------14737809831466499882746641449" let contentType = "multipart/form-data; boundary=/(boundary)" urlRequest.addValue(contentType, forHTTPHeaderField: "Content-Type") for (key, value) in postdatadictionary { if(value is Data) { let TimeStamp = "/(Date().timeIntervalSince1970 * 1000)" body.append("--/(boundary)/r/n".data(using: .utf8)!) body.append("Content-Disposition: form-data; name=/"/(key)/"; filename=/"/(TimeStamp)/"/r/n".data(using:.utf8)!) body.append("field_mobileinfo_image/r/n".data(using: .utf8)!) body.append("--/(boundary)/r/n".data(using: .utf8)!) body.append("Content-Disposition: form-data; name=/"files[field_mobileinfo_image]/"; filename=/"img.jpg/"/r/n".data(using: .utf8)!) body.append("Content-Type: image/jpeg/r/n/r/n".data(using: .utf8)!) // var imgData: Data? = nil // if let aKey = value as? Data { // imgData = NSData(data: aKey) as Data // } body.append(value as! Data) } else { if let anEncoding = "--/(boundary)/r/n".data(using: .utf8) { body.append(anEncoding) } if let anEncoding = "Content-Disposition: form-data; name=/"/(key)/"/r/n/r/n".data(using: .utf8) { body.append(anEncoding) } if let aKey = postdatadictionary[key], let anEncoding = "/(aKey)".data(using: .utf8) { body.append(anEncoding) } if let anEncoding = "/r/n".data(using: .utf8) { body.append(anEncoding) } } } if let anEncoding = "--/(boundary)--/r/n".data(using: .utf8) { body.append(anEncoding) } // setting the body of the post to the reqeust urlRequest.httpBody = body as Data URLSession.shared.dataTask(with:urlRequest) { (data, response, error) in if error != nil { print(error!) completion("") } else { var dictonary:NSDictionary? do { dictonary = try JSONSerialization.jsonObject(with: data!, options: []) as? NSDictionary if let myDictionary = dictonary { completion(myDictionary) } } catch let error as NSError { completion(error) } } Utils().HideLoader() }.resume() }


public func UPLOADIMG(url: String,parameters: Dictionary<String,AnyObject>?,filename:String,image:UIImage, success:((NSDictionary) -> Void)!, failed:((NSDictionary) -> Void)!, errord:((NSError) -> Void)!) { var TWITTERFON_FORM_BOUNDARY:String = "AaB03x" let url = NSURL(string: url)! var request:NSMutableURLRequest = NSMutableURLRequest(URL: url, cachePolicy: NSURLRequestCachePolicy.ReloadIgnoringLocalCacheData, timeoutInterval: 10) var MPboundary:String = "--/(TWITTERFON_FORM_BOUNDARY)" var endMPboundary:String = "/(MPboundary)--" //convert UIImage to NSData var data:NSData = UIImagePNGRepresentation(image) var body:NSMutableString = NSMutableString(); // with other params if parameters != nil { for (key, value) in parameters! { body.appendFormat("/(MPboundary)/r/n") body.appendFormat("Content-Disposition: form-data; name=/"/(key)/"/r/n/r/n") body.appendFormat("/(value)/r/n") } } // set upload image, name is the key of image body.appendFormat("%@/r/n",MPboundary) body.appendFormat("Content-Disposition: form-data; name=/"/(filename)/"; filename=/"pen111.png/"/r/n") body.appendFormat("Content-Type: image/png/r/n/r/n") var end:String = "/r/n/(endMPboundary)" var myRequestData:NSMutableData = NSMutableData(); myRequestData.appendData(body.dataUsingEncoding(NSUTF8StringEncoding)!) myRequestData.appendData(data) myRequestData.appendData(end.dataUsingEncoding(NSUTF8StringEncoding)!) var content:String = "multipart/form-data; boundary=/(TWITTERFON_FORM_BOUNDARY)" request.setValue(content, forHTTPHeaderField: "Content-Type") request.setValue("/(myRequestData.length)", forHTTPHeaderField: "Content-Length") request.HTTPBody = myRequestData request.HTTPMethod = "POST" // var conn:NSURLConnection = NSURLConnection(request: request, delegate: self)! let task = NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { data, response, error in if error != nil { println(error) errord(error) return } var parseError: NSError? let responseObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options: nil, error: &parseError) if let responseDictionary = responseObject as? NSDictionary { success(responseDictionary) } else { } }) task.resume() }