我无法使用Alamofire在多部分中上传多张图片.谁能帮我?
提前致谢!!
提前致谢!!
有关更多详细信息,我使用此代码创建图像数据的正文部分:
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 }
上传我正在使用:
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) } }
解决方法
我希望它对你有所帮助:
//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,mimeType: "image/jpeg") multipartFormData.append(imageData3,mimeType: "image/jpeg") multipartFormData.append(imageData4,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)") } }) }