swift3 alamofire

swift3 - subir imagen al servidor usando Alamofire



(9)

Código actualizado a Swift 5 .

En swift 5 hay un cambio en esta línea

user_photo is key for dic swift_file.jpg is value for value Write the same withName is key Write the same fileName is value call the UploadImage(Image) func UploadImage(img:UIImage) { let urlfinal = “ananda.profile.php"; let parameters = ["user_id":"531", "user_photo”: "swift_file.jpg"] Alamofire.upload(multipartFormData: { (multipartFormData) in multipartFormData.append(UIImageJPEGRepresentation(img, 1)!, withName: "user_photo", fileName: "swift_file.jpeg", mimeType: "image/jpg") for (key, value) in parameters { multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) } print(multipartFormData) }, to:urlfinal) { (result) in switch result { case .success(let upload, , ): upload.uploadProgress(closure: { (progress) in }) upload.responseJSON { response in print(response) } case .failure( _): break } } }

Para gustar esto

let imageData = UIImageJPEGRepresentation(image!, 0.2)!

Código completo para subir imagen

let imageData = image.jpegData(compressionQuality: 0.50)

Este es mi código que quiero cargar la imagen al servidor usando Alamofire, no es un error, pero no puede empujar la imagen al servidor. Qué tengo que hacer ? Gracias de antemano.

let url = URL(string: urlString)! var urlRequest = URLRequest(url: url) urlRequest.httpMethod = "POST" let parameters = ["name": rname] do { urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: []) } catch { print(error) } urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type") let image = UIImage.init(named: "myImage") let imgData = UIImageJPEGRepresentation(image!, 0.2)! Alamofire.upload(multipartFormData: { MultipartFormData in MultipartFormData.append(imgData, withName: "fileset", fileName: "name", mimeType: "image/jpg") },with: urlRequest,encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload.responseJSON { response in if let info = response.result.value as? Dictionary<String, AnyObject> { if let links = info["links"] as? Dictionary<String, AnyObject> { if let imgLink = links["image_link"] as? String { print("LINK: /(imgLink)") } } } } case .failure(let error): print(error) } })


El único que trabaja para mí en esta fecha:

let headers: HTTPHeaders = [ /* "Authorization": "your_access_token", in case you need authorization header */ "Content-type": "multipart/form-data" ] AF.upload( multipartFormData: { multipartFormData in multipartFormData.append(imageOrVideo!.jpegData(compressionQuality: 0.5)!, withName: "upload_data" , fileName: "file.jpeg", mimeType: "image/jpeg") }, to: "http://35.227.31.145/new.php", method: .post , headers: headers) .response { resp in print(resp) }


Necesita especificar name, fileName, mimeType , estos son importantes para muchos servidores

func upload(image: UIImage, completion: (URL?) -> Void) { guard let data = UIImageJPEGRepresentation(image, 0.9) else { return } Alamofire.upload(multipartFormData: { (form) in form.append(data, withName: "file", fileName: "file.jpg", mimeType: "image/jpg") }, to: "https://yourawesomebackend.com", encodingCompletion: { result in switch result { case .success(let upload, _, _): upload.responseString { response in print(response.value) } case .failure(let encodingError): print(encodingError) } }) }


Ok Bro, uso este código con Swift 4 y Alamofire

import Foundation import Alamofire class UploadImageController: NSObject { // MARK: - shared static let shared = UploadImageController() // MARK: - init let decoder = JSONDecoder() // MARK: - uploadImageOnly func uploadImageWith(endUrl: String, photo: UIImage?, parameters: [String : Any]?, headers: HTTPHeaders?, completion: @escaping (_ success: Bool, _ uploadImageResponse: UploadImageResponse?) -> Void ) { Alamofire.upload(multipartFormData: { (multipartFormData) in if let data = UIImageJPEGRepresentation(photo!, 0.5) { multipartFormData.append(data, withName: "invoice", fileName: "invoice.jpeg", mimeType: "invoice/jpeg") } }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: endUrl, method: .post, headers: headers) { (result) in switch result { case .failure(let error): print("UploadImageController.requestWith.Alamofire.usingThreshold:", error) completion(false, nil) case .success(request: let upload, streamingFromDisk: _, streamFileURL: _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: /(progress.fractionCompleted)") }) upload.responseJSON(completionHandler: { (response) in switch response.result { case .failure(let error): print("UploadImageController.requestWith.Alamofire.upload.responseJSON:", error) completion(false, nil) case .success( _): print("UploadImageController.requestWith.Alamofire.upload.responseJSON Succes") guard let data = response.data else { return } do { let uploadImageResponse = try self.decoder.decode(UploadImageResponse.self, from: data) completion(true, uploadImageResponse) } catch let jsonError { print("Error serializing json.ProfileController.getProfile:", jsonError) completion(false, nil) } } }) } } } // MARK: - uploadImageWithParameters func uploadImageWithParametersAnd(endUrl: String, photo: UIImage?, parameters: [String : Any]?, headers: HTTPHeaders?, completion: @escaping (_ success: Bool, _ addInvoiceResponse: AddInvoiceResponse?) -> Void ) { Alamofire.upload(multipartFormData: { (multipartFormData) in if let data = UIImageJPEGRepresentation(photo!, 0.5) { multipartFormData.append(data, withName: "invoicePicture", fileName: "invoicePicture.jpeg", mimeType: "invoice/jpeg") } for (key, value) in parameters! { multipartFormData.append("/(value)".data(using: String.Encoding.utf8)!, withName: "/(key)") } }, usingThreshold: SessionManager.multipartFormDataEncodingMemoryThreshold, to: endUrl, method: .post, headers: headers) { (result) in switch result { case .failure(let error): print("UploadImageController.requestWith.Alamofire.usingThreshold:", error) completion(false, nil) case .success(request: let upload, streamingFromDisk: _, streamFileURL: _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: /(progress.fractionCompleted)") }) upload.responseJSON(completionHandler: { (response) in switch response.result { case .failure(let error): print("UploadImageController.requestWith.Alamofire.upload.responseJSON:", error) completion(false, nil) case .success( _): print("UploadImageController.requestWith.Alamofire.upload.responseJSON Succes") guard let data = response.data else { return } do { let addInvoiceResponse = try self.decoder.decode(AddInvoiceResponse.self, from: data) completion(true, addInvoiceResponse) } catch let jsonError { print("Error serializing json.ProfileController.getProfile:", jsonError) completion(false, nil) } } }) } } } }

Por ejemplo, esta AddInvoiceResponse

import Foundation struct AddInvoiceResponse: Decodable { let id, message: String? }

y aquí UploadImageResponse

import Foundation struct UploadImageResponse: Codable { let id, message: String? }


Prueba el siguiente código

let image = UIImage.init(named: "myImage") let imgData = UIImageJPEGRepresentation(image!, 0.2)! let parameters = ["name": rname] //Optional for extra parameter Alamofire.upload(multipartFormData: { multipartFormData in multipartFormData.append(imgData, withName: "fileset",fileName: "file.jpg", mimeType: "image/jpg") for (key, value) in parameters { multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) } //Optional for extra parameters }, to:"mysite/upload.php") { (result) in switch result { case .success(let upload, _, _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: /(progress.fractionCompleted)") }) upload.responseJSON { response in print(response.result.value) } case .failure(let encodingError): print(encodingError) } }


Pruebe el siguiente código para la carga de imágenes múltiples. preguntado por @Saurabh.

Sin embargo, es mejor hacer la carga 1 por 1 en lugar de cargar todo de una vez.
porque si falla, solo fallará en 1 imagen. pero cargue todo de una vez. Si un archivo falló, el usuario debe reiniciar el proceso de carga desde el principio.

Sin embargo, esto es lo que debe hacer si desea cargar varios datos a la vez.

let image1 = UIImage.init(named: "myImage1") let image2 = UIImage.init(named: "myImage2") let image3 = UIImage.init(named: "myImage3") let image4 = UIImage.init(named: "myImage4") let imgData1 = UIImageJPEGRepresentation(image!, 0.2)! let imgData2 = UIImageJPEGRepresentation(image!, 0.2)! let imgData3 = UIImageJPEGRepresentation(image!, 0.2)! let imgData4 = UIImageJPEGRepresentation(image!, 0.2)! let parameters = ["name": rname] //Optional for extra parameter Alamofire.upload(multipartFormData: { multipartFormData in //loop this "multipartFormData" and make the key as array data multipartFormData.append(imgData1, withName: "fileset[0]",fileName: "file.jpg", mimeType: "image/jpg") multipartFormData.append(imgData2, withName: "fileset[1]",fileName: "file.jpg", mimeType: "image/jpg") multipartFormData.append(imgData3, withName: "fileset[2]",fileName: "file.jpg", mimeType: "image/jpg") multipartFormData.append(imgData4, withName: "fileset[3]",fileName: "file.jpg", mimeType: "image/jpg") for (key, value) in parameters { multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key) } //Optional for extra parameters }, to:"mysite/upload.php") { (result) in switch result { case .success(let upload, _, _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: /(progress.fractionCompleted)") }) upload.responseJSON { response in print(response.result.value) } case .failure(let encodingError): print(encodingError) } }

Nota: multipartFormData está utilizando append, lo que significa que es una matriz de solicitud. puede hacer un bucle y agregar más si es necesario.


let param: [String:Any] = ["your_parameters"] var image = UIImage() image = UIImage(named: "edit.png")! let imageData = image.jpegData(compressionQuality: 0.50) print(image, imageData!) Alamofire.upload(multipartFormData: { (multipartFormData) in multipartFormData.append(imageData!, withName: "file", fileName: "swift_file.png", mimeType: "image/png") for (key, value) in param { multipartFormData.append("/(value)".data(using: String.Encoding.utf8)!, withName: key) } }, to: "your_url") { (result) in switch result { case .success(let upload, _, _): upload.uploadProgress(closure: { (progress) in //Print progress print("uploading /(progress)") }) upload.responseJSON { response in //print response.result } case .failure( _): break //print encodingError.description } } }


let params: Parameters = ["name": "abcd" "gender": "Male"] Alamofire.upload(multipartFormData: { (multipartFormData) in multipartFormData.append(UIImageJPEGRepresentation(self.yourimageView.image!, 0.1)!, withName: "image", fileName: "file.jpeg", mimeType: "image/jpeg") for (key, value) in params { multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) } }, to:yourUrl,headers:nil) { (result) in switch result { case .success(let upload,_,_ ): upload.uploadProgress(closure: { (progress) in //Print progress }) upload.responseJSON { response in //print response.result if response.result.value != nil { let dict :NSDictionary = response.result.value! as! NSDictionary let status = dict.value(forKey: "status")as! String if status=="1" { print("DATA UPLOAD SUCCESSFULLY") } } } case .failure(let encodingError): break } }


let url = BaseViewController.API_URL + "uploads" let image = info[UIImagePickerControllerEditedImage] as? UIImage let imgData = UIImageJPEGRepresentation(image!, 0.2)! let parameters = [ "user_id" : UserDefaults.standard.value(forKey: "userId")! ] Alamofire.upload(multipartFormData: { multipartFormData in multipartFormData.append(imgData, withName: "uload_data",fileName: "file.jpg", mimeType: "image/jpg") for (key, value) in parameters { multipartFormData.append((value as AnyObject).data(using: String.Encoding.utf8.rawValue)!, withName: key) } //Optional for extra parameters }, to:url) { (result) in switch result { case .success(let upload, _, _): upload.uploadProgress(closure: { (progress) in print("Upload Progress: /(progress.fractionCompleted)") }) upload.responseJSON { response in self.objHudHide() print(response.result.value) let jsonDict : NSDictionary = response.result.value as! NSDictionary print(jsonDict) if jsonDict["status"] as! String == "Success" { let detailDict : Dictionary = jsonDict["detail"] as! Dictionary<String,Any> if let getTotalPrice = detailDict["total_price"] { self.lblTotalPrice.text = "$ /(getTotalPrice) + Free Shipping" } if let getTotalSize = detailDict["total_upload_size"] { self.lblTotalSize.text = "Total Size : /(getTotalSize)" } } else { let alertViewController = UIAlertController(title: NSLocalizedString("Alert!", comment: ""), message:"Something Went wrong please try again." , preferredStyle: .alert) let okAction = UIAlertAction(title: NSLocalizedString("Ok", comment: ""), style: .default) { (action) -> Void in } alertViewController.addAction(okAction) self.present(alertViewController, animated: true, completion: nil) } } case .failure(let encodingError): print(encodingError) } }