在 Alamofire 中上传包含多部分表单数据的多张图片时出错
Getting error while uploading multiple images with multipart form data in Alamofire
我搜索了很多问题并应用了解决方案,但不知何故我的逻辑无法正常工作。这是 API 调用中的预期内容:
我要打的电话是:
let parameters = [
"address": self.addressField.text ?? "",
"pharmacy_id": "\(pharmaID ?? 0)",
"is_default": "\(isDefault ?? 0)",
"cash_payment": "\(1)",
"is_home_delivery": "\(isDelivery ?? 0)"
] as [String : Any]
Alamofire.upload(multipartFormData:{ multipartFormData in
for key in parameters.keys {
let name = String(key)
if let val = parameters[name] as? String{
multipartFormData.append(val.data(using: .utf8)!, withName: name)
}
}
DispatchQueue.main.async {
for (image) in self.presImagesArray {
if let imageData = UIImageJPEGRepresentation(image, 0.5) {
multipartFormData.append(imageData, withName: "prescription[]", fileName: "image.jpeg", mimeType: "image/jpeg")
}
}
// for (image) in self.presImagesArray {
// multipartFormData.append(UIImageJPEGRepresentation(image, 0.1)!, withName: "prescription", fileName: "image.jpg", mimeType: "image/jpg")
// }
}
},
usingThreshold:UInt64.init(),
to:url,
method:.post,
headers:headers,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
// if let result = response.result.value as? [String: AnyObject] {
// print(result["message"])
// }
print(response)
self.clearAllNotice()
self.successNotice("Success")
}
case .failure(let encodingError):
print(encodingError, encodingError.localizedDescription)
self.clearAllNotice()
self.errorNotice(encodingError.localizedDescription)
}
})
} else {
self.noticeInfo("Login Needed")
}
}
我遇到的问题是调用 returns 并显示 The prescription field is required.
的消息,这意味着 prescription[]
中的上传图片无法正常工作,后端人员说问题出在我这边。
正如您从代码中看到的那样,我添加了一个 for
循环,在其中我正在转换和发送图像数据,关键是 prescription[]
但我仍然得到这个回复。
您的问题是您正在调用 DispatchQueue.main.async
来创建图像。一旦您离开此方法,此闭包的调用方就会继续,因此由于您是异步添加图像,因此在添加图像之前已经发送了参数。
如果您确实需要调用不同的队列,则需要使用 DispatchQueue.main.sync
来阻止关闭直到分派完成。但是,你不需要这个,也不建议你在 main/UI 线程上执行 UIImageJPEGRepresentation
,因为它是一个繁重的函数,你会阻塞 UI。
我搜索了很多问题并应用了解决方案,但不知何故我的逻辑无法正常工作。这是 API 调用中的预期内容:
我要打的电话是:
let parameters = [
"address": self.addressField.text ?? "",
"pharmacy_id": "\(pharmaID ?? 0)",
"is_default": "\(isDefault ?? 0)",
"cash_payment": "\(1)",
"is_home_delivery": "\(isDelivery ?? 0)"
] as [String : Any]
Alamofire.upload(multipartFormData:{ multipartFormData in
for key in parameters.keys {
let name = String(key)
if let val = parameters[name] as? String{
multipartFormData.append(val.data(using: .utf8)!, withName: name)
}
}
DispatchQueue.main.async {
for (image) in self.presImagesArray {
if let imageData = UIImageJPEGRepresentation(image, 0.5) {
multipartFormData.append(imageData, withName: "prescription[]", fileName: "image.jpeg", mimeType: "image/jpeg")
}
}
// for (image) in self.presImagesArray {
// multipartFormData.append(UIImageJPEGRepresentation(image, 0.1)!, withName: "prescription", fileName: "image.jpg", mimeType: "image/jpg")
// }
}
},
usingThreshold:UInt64.init(),
to:url,
method:.post,
headers:headers,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.responseJSON { response in
// if let result = response.result.value as? [String: AnyObject] {
// print(result["message"])
// }
print(response)
self.clearAllNotice()
self.successNotice("Success")
}
case .failure(let encodingError):
print(encodingError, encodingError.localizedDescription)
self.clearAllNotice()
self.errorNotice(encodingError.localizedDescription)
}
})
} else {
self.noticeInfo("Login Needed")
}
}
我遇到的问题是调用 returns 并显示 The prescription field is required.
的消息,这意味着 prescription[]
中的上传图片无法正常工作,后端人员说问题出在我这边。
正如您从代码中看到的那样,我添加了一个 for
循环,在其中我正在转换和发送图像数据,关键是 prescription[]
但我仍然得到这个回复。
您的问题是您正在调用 DispatchQueue.main.async
来创建图像。一旦您离开此方法,此闭包的调用方就会继续,因此由于您是异步添加图像,因此在添加图像之前已经发送了参数。
如果您确实需要调用不同的队列,则需要使用 DispatchQueue.main.sync
来阻止关闭直到分派完成。但是,你不需要这个,也不建议你在 main/UI 线程上执行 UIImageJPEGRepresentation
,因为它是一个繁重的函数,你会阻塞 UI。