在 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。