我无法使用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)
}
}
任何人都可以让我建议使用Alamofire上传多个文件的方式吗?
解决方法
我希望它对你有所帮助:
使用Swift 3x :(我已在此代码段中上传了四张照片)
//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)")
}
})
}