swiftyjson multipartformdata example xcode swift upload alamofire

xcode - multipartformdata - Cómo subir imágenes con parámetros usando Alamofire en Swift



alamofire upload multipartformdata (6)

Estoy desarrollando una aplicación para iPhone con swift. y estoy usando el marco de Alamofire para manejar solicitudes de http. Utilizo Alamofire.request para POST, GET y etc. como esto:

Alamofire.request(.POST, myURL , parameters: ["a": "1", "b" : "2" ]) .response { (request, response, data, error) in }

Y utilizo Alamofire.upload para subir la imagen al servidor:

Alamofire.upload(.POST, uploadURL , fileURL)

Y ambos funcionan perfectamente, pero ahora quiero cargar una imagen y también enviar algunos parámetros, y mi tipo de contenido debería ser multipart/form-data y Alamofire.upload no acepta parámetros.

Hay dos preguntas más sobre SO sobre este problema con swift, la primera no usa Alamofire (y en realidad, ¿por qué no?) Y en la segunda , mattt (Alamofire Developer) citado para usar los parámetros de codificación.

Revisé su ejemplo, pero todavía no podía averiguar cómo hacerlo.

¿Puede alguien ayudarme a resolver este problema?

¡Gracias! :)


Swift 4 con Alamofire 4

let isConnected = connectivity.isConnectedToInternet() func updateProfile(firstName:String,lastName:String ,imageData:Data?,completion: @escaping (isValidUser)->()) { if self.isConnected { var parameters : [String:String] = [:] parameters["auth_key"] = loginUser?.authKey! parameters["User[first_name]"] = firstName parameters["User[last_name]"] = lastName let url = "/(baseUrl)/(basicAuthenticationUrl.updateProfile)" print(url) Alamofire.upload(multipartFormData: { (multipartFormData) in for (key, value) in parameters { multipartFormData.append("/(value)".data(using: String.Encoding.utf8)!, withName: key as String) } if let data = imageData { multipartFormData.append(data, withName: "image_url", fileName: "image.png", mimeType: "image/png") } }, usingThreshold: UInt64.init(), to: url, method: .post) { (result) in switch result{ case .success(let upload, _, _): upload.responseJSON { response in print("Succesfully uploaded = /(response)") if let err = response.error{ print(err) return } } case .failure(let error): print("Error in upload: /(error.localizedDescription)") } } } }


Para usar los parámetros de codificación, cree una variable de codificación de parámetros, asígnele un tipo de codificación (caso de la enumeración que incluye .JSON, .URL) y luego use la función de codificación con su NSURLRequest y los parámetros. Esta función devuelve una tupla de dos elementos, el primero es el NSURLRequest resultante y el segundo el posible NSError resultante.

Así es como lo usé para un encabezado personalizado que necesitaba en un proyecto

var parameterEncoding:ParameterEncoding! switch method { case .POST, .PUT : parameterEncoding = ParameterEncoding.JSON default : parameterEncoding = ParameterEncoding.URL } var alamoRequest = Alamofire.Manager.sharedInstance.request(parameterEncoding.encode(mutableURLRequest, parameters: parameters).0)


Puedes usar Alamofire 3.0+ debajo del código

func uploadImageAndData(){ //parameters let gender = "M" let firstName = "firstName" let lastName = "lastName" let dob = "11-Jan-2000" let aboutme = "aboutme" let token = "token" var parameters = [String:AnyObject]() parameters = ["gender":gender, "firstName":firstName, "dob":dob, "aboutme":about, "token":token, "lastName":lastName] let URL = "http://yourserviceurl/" let image = UIImage(named: "image.png") Alamofire.upload(.POST, URL, multipartFormData: { multipartFormData in if let imageData = UIImageJPEGRepresentation(image, 0.6) { multipartFormData.appendBodyPart(data: imageData, name: "image", fileName: "file.png", mimeType: "image/png") } for (key, value) in parameters { multipartFormData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) } }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): print("s") upload.responseJSON { response in print(response.request) // original URL request print(response.response) // URL response print(response.data) // server data print(response.result) // result of response serialization if let JSON = response.result.value { print("JSON: /(JSON)") } } case .Failure(let encodingError): print(encodingError) } }) }


Almaofire con Swift 2.0 simplemente copie y pegue debajo del código. Aquí asumo la respuesta JSON del servidor

func uploadImageRemote (imageData : NSData?) -> Dictionary <String,AnyObject>{ var imageDictionary = Dictionary<String,AnyObject>() var tokenHeaders:[String:String]! = ["x-access-token":Constants.kUserDefaults.stringForKey("userToken")!] Alamofire.upload( .POST, "http://52.26.230.146:3300/api/profiles/imageUpload",headers:tokenHeaders, multipartFormData: { multipartFormData in multipartFormData.appendBodyPart(data: imageData!, name: "upload", fileName: "imageFileName.jpg", mimeType: "image/jpeg") }, encodingCompletion: { encodingResult in switch encodingResult { case .Success(let upload, _, _): upload.progress { (bytesWritten, totalBytesWritten, totalBytesExpectedToWrite) in print("Uploading Avatar /(totalBytesWritten) / /(totalBytesExpectedToWrite)") dispatch_async(dispatch_get_main_queue(),{ }) } upload.responseJSON { response in guard response.result.error == nil else { print("error calling GET /(response.result.error!)") return } if let value = response.result.value { print("Success JSON is:/(value)") if let result = value as? Dictionary<String, AnyObject> { imageDictionary["imageUrl"] = result["url"] } } dispatch_async(dispatch_get_main_queue(),{ //Show Alert in UI print("Avatar uploaded"); }) } case .Failure(let encodingError): //Show Alert in UI print("Avatar not uploaded /(encodingError)"); } } ); return imageDictionary }


Almaofire con swift 3.0

Alamofire.upload(multipartFormData: { multipartFormData in var index = 1 for image in imageArray { let imageData: Data = (UIImageJPEGRepresentation(image, 1.0) as Data?)! multipartFormData.append(imageData, withName: "home-/(index)", fileName: "home-/(index)", mimeType: "image/jpeg") index += 1 } }, with: requestName, encodingCompletion: { result in switch result { case .success(let upload, _, _): upload.responseJSON { response in print("Image(s) Uploaded successfully:/(response)") } case .failure(let encodingError): print("encodingError:/(encodingError)") } })


SWIFT 2 AlamoFire Simple Image Upload (API REST)

@amit gupta Parece que la respuesta contiene una gran sobrecarga. AlamoFire contiene carga de solución simplificada. El método Alamofire.request contiene varias sobrecargas simplificadas que se pueden usar para cargar de manera simple. Al utilizar Alamofire.request (el desarrollador del método puede deshacerse de la sobrecarga de codificación).

El estado HTTP 415 da porque no se especifica el tipo de medio correcto.

Por favor revise mi solución a continuación.

import UIKit import Alamofire class ViewController: UIViewController { @IBOutlet var imageView: UIImageView! @IBOutlet var btnUpload: UIButton! override func viewDidLoad() { super.viewDidLoad() } func successDataHandler(responseData:String){ print ("IMAGE UPLOAD SUCCESSFUL !!!") } func failureDataHandler(errorData:String){ print (" !!! IMAGE UPLOAD FAILURE !!! ") } @IBAction func actionUpload(sender: AnyObject) { let URL = "http://m8coreapibeta.azurewebsites.net/api/cards/SaveImages" let postDataProlife:[String:AnyObject] = ["CardId":(dataCardDetail?.userId)!,"ImageType":1,"ImageData":imageView.image!] uplaodImageData(URL, postData: postDataProlife, successHandler: successDataHandler, failureHandler: failureDataHandler) } func uplaodImageData(RequestURL: String,postData:[String:AnyObject]?,successHandler: (String) -> (),failureHandler: (String) -> ()) -> () { let headerData:[String : String] = ["Content-Type":"application/json"] Alamofire.request(.POST,RequestURL, parameters: postData, encoding: .URLEncodedInURL, headers: headerData).responseString{ response in switch response.result { case .Success: print(response.response?.statusCode) successHandler(response.result.value!) case .Failure(let error): failureHandler("/(error)") } } } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }