Swift用Alamofire上传multipartFormData报URLRequest无failure成员错误如何解决
错误原因
你参考的代码是Alamofire 4版本的写法,你当前使用的是Alamofire 5及以上版本,两个版本的上传接口逻辑有较大差异:
Alamofire 5的AF.upload方法不存在接收上传结果Result枚举的尾随闭包参数,你额外添加的这个闭包实际是用于自定义修改URLRequest的回调,入参为inout URLRequest类型,对该类型做.success、.failure的枚举匹配自然会触发类型成员不存在的报错。
修复方案
Alamofire 5已经不需要单独处理multipart编码的结果,直接在AF.upload调用后链式追加响应回调即可,同时修正你代码中的其他逻辑问题,修复后的代码如下:
func savePreferences(parameters: [String:Any], image: UIImage, completion: @escaping (Any?, Error?) -> Void) { let url = "http://localhost:3000/users/3b4e124d-3b3c-4c71-8e05-013e461c2892" guard let imgData = image.jpegData(compressionQuality: 0.5) else { completion(nil, NSError(domain: "ImageError", code: -1, userInfo: [NSLocalizedDescriptionKey: "图片压缩失败"])) return } AF.upload(multipartFormData: { multipartFormData in multipartFormData.append(imgData, withName: "profile_imgname",fileName: "ProfilePic_\(UserDefaults.standard.string(forKey: "user_id") ?? "").jpg", mimeType: "image/jpeg") for (key, value) in parameters { if let data = "\(value)".data(using: .utf8) { multipartFormData.append(data, withName: key) } } }, to: url, method: .patch) .responseJSON { response in switch response.result { case .success(let value): completion(value, nil) case .failure(let error): print("Error in upload: \(error.localizedDescription)") completion(nil, error) } } }
关键修改点
- 移除了
AF.upload后错误添加的尾随闭包,直接链式调用responseJSON处理最终响应结果 - 替换了原本不存在的
failure()方法调用,统一使用你定义的completion回调返回结果 - 优化了图片压缩、参数转data的强制解包逻辑,避免异常崩溃
- 修正了mimeType的取值,标准jpeg格式的mimeType为
image/jpeg
内容的提问来源于stack exchange,提问作者user11371080
相关产品推荐
相关产品推荐

