You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:57:04