¿Cómo upload varias imágenes en varias partes usando Alamofire?

Estoy atrapado en la carga de múltiples imágenes en varias partes con Alamofire. ¿Alguien puede ayudarme? ¡¡Gracias por adelantado!!

Para más detalles, estoy usando este código para crear parte del cuerpo de datos de imágenes:

func imageArrayToNSData(array: [UIImage],boundary:String) -> NSData { let body = NSMutableData() var i = 0; for image in array{ let filename = "image\(i).jpg" let data = UIImageJPEGRepresentation(image,0.8); let mimetype = "image/jpeg" let key = "product_images" body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("--\(boundary)\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Disposition: form-data; name=\"\(key)\"; filename=\"\(filename)\"\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData("Content-Type: \(mimetype)\r\n\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) body.appendData(data!) body.appendData("\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) i += 1 } body.appendData("--\(boundary)--\r\n".dataUsingEncoding(NSUTF8StringEncoding)!) return body } 

para cargar estoy usando:

  Alamofire.upload(.POST, EDIT_PRODUCT_URL, headers: ["Accept": "application/json","Content-Type":"application/json"], multipartFormData: { (formData) in if productImages.count>0{ let boundary = generateBoundaryString() let imageData = CommonClass.imageArrayToNSData(productImages,boundary: boundary) formData.appendBodyPart(data: imageData, name: "product_images", mimeType: "image/jpeg") } for (key, value) in params { if value is [String]{ let data = CommonClass.stringArrayToNSData(value as! [String]) formData.appendBodyPart(data:data , name: key) }else if value is String{ formData.appendBodyPart(data: value.dataUsingEncoding(NSUTF8StringEncoding)!, name: key) }else if let v = value as? Bool{ var bValue = v let d = NSData(bytes: &bValue, length: sizeof(Bool)) formData.appendBodyPart(data: d, name: key) } } }) { (encodingResult) in switch encodingResult { case .Success(let upload, _, _): KVNProgress.showProgress(CGFloat(0), status:"0% Sent") upload.progress { bytesWritten, totalBytesWritten, totalBytesExpectedToWrite in // This closure is NOT called on the main queue for performance // reasons. To update your ui, dispatch to the main queue. dispatch_async(dispatch_get_main_queue()) { let prg = Int((CGFloat(totalBytesWritten)*100)/CGFloat(totalBytesExpectedToWrite)) if prg == 100{ KVNProgress.showSuccessWithStatus("Created") } KVNProgress.updateStatus("\(prg)% Sent") KVNProgress.updateProgress(CGFloat(Float(prg)/100.0), animated: true) } } upload.responseJSON { response in CommonClass.hideLoader() switch response.result { case .Success: if let value = response.result.value { let json = JSON(value) print_debug("edit Product JSON is\n\(json)"); completionBlock(json) }else{ completionBlock(nil) } case .Failure(let error): print_debug(error.description) showErrorWithMessage("Oops! Couldn't connect to server!") completionBlock(nil) } } case .Failure(let encodingError): print(encodingError) } } 

¿Alguien puede permitirme sugerirle la forma de cargar múltiples files en varias partes usando Alamofire?

Espero que sea útil para usted:

Usando Swift 3x: (he subido cuatro fotos en este fragment)

  //MARK: - upload multiple photos func uploadImagesAndData(params:[String : AnyObject]?,image1: UIImage,image2: UIImage,image3: UIImage,image4: UIImage,headers : [String : String]?, completionHandler:@escaping CompletionHandler) -> Void { let imageData1 = UIImageJPEGRepresentation(image1, 0.5)! let imageData2 = UIImageJPEGRepresentation(image2, 0.5)! let imageData3 = UIImageJPEGRepresentation(image3, 0.5)! let imageData4 = UIImageJPEGRepresentation(image4, 0.5)! Alamofire.upload(multipartFormData: { multipartFormData in for (key, value) in params! { if let data = value.data(using: String.Encoding.utf8.rawValue) { multipartFormData.append(data, withName: key) } } multipartFormData.append(imageData1, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") multipartFormData.append(imageData2, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") multipartFormData.append(imageData3, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") multipartFormData.append(imageData4, withName: "file", fileName: "image.jpg", mimeType: "image/jpeg") }, to: K_BASEURL + K_API_LOGINDATA, encodingCompletion: { encodingResult in switch encodingResult { case .success(let upload, _, _): upload .validate() .responseJSON { response in switch response.result { case .success(let value): print("responseObject: \(value)") case .failure(let responseError): print("responseError: \(responseError)") } } case .failure(let encodingError): print("encodingError: \(encodingError)") } }) } 

Para cargar varias imágenes, debe llamar a este código en bucle

 let boundary = generateBoundaryString() let imageData = CommonClass.imageArrayToNSData(productImages,boundary: boundary) formData.appendBodyPart(data: imageData, name: "product_images", mimeType: "image/jpeg") 

1) Para cargar múltiples imágenes con Alamofire en Swift3

 typealias APICompletionHandler = (code:Int, error:NSError?, response:AnyObject?) -> Void func uploadIMultipart(_ strApiName:String, param : NSDictionary?, data:Array<NSDictionary>, header:[String : String]?, completionHandler:@escaping APICompletionHandler) { let strURL : String = strApiName let apiURL = try! URLRequest(url: strURL, method: .post, headers: header) Alamofire.upload(multipartFormData: { (multipartFormData) in // code var i : Int = 0 for dict:NSDictionary in data { let extention = dict["format"] as? String let strMimeType = dict["strMimeType"] as? String let nameofFile:String = (6.randomString as String)+"."+extention! if (dict["data"] as? Data != nil) { multipartFormData.append(Foundation.Data(dict["data"] as! Data), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!) } else { let strUrl = dict["data"] as! String let fileURL : URL? = URL(string: strUrl) multipartFormData.append(try! Foundation.Data(contentsOf: fileURL!), withName: dict["key"] as! String, fileName: nameofFile , mimeType: strMimeType!) } i += 1 } for (key, value) in param! { multipartFormData.append((value as! NSString).data(using: String.Encoding.utf8.rawValue)!, withName: key as! String) } }, with: apiURL, encodingCompletion: { (result) in // code switch result { case .success(let upload,_ ,_ ): upload.responseJSON { response in switch response.result { case .success(let data): //Sucess case .failure(let error): print(error.localizedDescription) } } case .failure(let encodingError): print(encodingError) completionHandler(0, encodingError as NSError?, nil) } }) } 

2) para llamar a la function

  let imageData : NSData = UIImagePNGRepresentation(imgUserProfile.image!)! as NSData let imageData1 : NSData = UIImagePNGRepresentation(imgUserProfile.image!)! as NSData let dict1: Dictionary = ["data":imageData,"key":"user_image", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any] let dict2: Dictionary = ["data":imageData1,"key":"image1", "format":"jpg", "strMimeType":"image/jpeg"] as [String : Any] let array: Array = [dict1,dict2]; //pass this image array self.uploadIMultipart(strAPI, param: dictParam as NSDictionary, data: array as Array<NSDictionary>, header: nil) { (code, error, response) in AppSingletonObj.stopLoading(inView: self.view) //API manager sucess or failure if code == 1 { let status = response?["success"] //API sucess or failure if(status as! Int == 1) { print(response!) } else { let errorMessage = response?["message"] AppSingletonObj.showAlert(msg: errorMessage as! String) } } else { AppSingletonObj.showAlert(msg: "Some error occunetworking! please try after sometime") } } 

3) Extensión para crear el nombre del file

 //MARK: CREATE RANDOM STRING of LENGTH extension Int{ var randomString : String { let letters : NSString = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" let randomString : NSMutableString = NSMutableString(capacity: self) for _ in 0 ..< self{ let length = UInt32 (letters.length) let rand = arc4random_uniform(length) randomString.appendFormat("%C", letters.character(at: Int(rand))) } return randomString as String } }