如何在 multiformData 的 alamofire 中上传文件?

Posted

技术标签:

【中文标题】如何在 multiformData 的 alamofire 中上传文件?【英文标题】:how to upload file in alamofire in multiformData? 【发布时间】:2020-11-08 17:07:56 【问题描述】:

我需要上传一张我尝试过的带有 multipart/form-data 的图片:

 static func uploadFile(image: UIImage?, parameters:Parameter,onResponse:@escaping(_ result:Parameter)-> (),onFailure:@escaping(_ error:Error)->())
        
        let url = "ip address"
        let imageData = image?.jpegData(compressionQuality: 0.7)
        let headers: HTTPHeaders = [
            "Authorization": TOKEN!
        ]
  
        Alamofire.upload(multipartFormData:  (multipartFormData) in
      
            multipartFormData.append("\(parameters.toJSON())".data(using: String.Encoding.utf8)!, withName: "entity")
    
            if let data = imageData
                multipartFormData.append(data, withName: "mp3")
            
            
        , usingThreshold: UInt64.init(), to: url, method: .post, headers: getHeaders())  (result) in
            
            switch result
            case .success(let upload, _, _):
                upload.responseJSON  response in
                    print("Succesfully uploaded",response.error)
                    if let err = response.error
                        return
                    
                
            case .failure(let error):
                print("Error in upload: \(error.localizedDescription)")
            
        
        
    

我需要发送实体模型和图像。但我必须将图像作为 formData 发送,而不是在正文中。

注意:发送带有“文件”键的图像和带有“实体”键的类

我无法快速解决它....

错误:

Succesfully uploaded Optional(Alamofire.AFError.responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo=NSDebugDescription=Invalid value around character 0.)))

【问题讨论】:

你既没有打电话给onResponse,也没有打电话给onFailure。您是否为了简化代码 sn-ps 而删除了它?或者你真的没有调用这些闭包吗?是网络请求不成功还是你没有调用闭包的问题。 最后,如果您不能 100% 确定请求是否正确,我建议使用 Charles 或 WireShark 等工具来观察请求并确保其格式正确。例如。 parameters.toJSON() 的字符串插值很容易导致问题,例如,如果toJSON 已经返回了Data。如果没有看到 toJSON 的方法签名,我们无法对此发表评论... 感谢 Rob 回答我。我将控制台内容放在我的 post.cheek 中,但其中没有明确的数据。我有 case .success 和 case 。失败不正确吗?网络请求成功。 让我向您解释更多。服务器端希望我在正文请求中有一个键名为“entity”的类,以及键名为“file”的图像。完毕。你是怎么做到的? ouhhhh 最后...我有两个问题。 1. 用密钥和文件名附加文件是正确的我忘记了文件名。 2.parameter.ToJson() 不正确。 ToJsonString() 是正确的。抢张贴这些提示我会投票给你。谢谢 【参考方案1】:

先读取 cmets。

即使在文件上传前一步设置了文件名,也不要忘记添加文件名。

尝试使用 ToJsonString() 而不是 ToJson()

【讨论】:

以上是关于如何在 multiformData 的 alamofire 中上传文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 项目中添加 Alamofire

如何使用 Alamofire 同时传递 queryStrings 和 JSON Body

模块“Alamofire”没有名为“upload”的成员

Today Extension 上的 CocoaPods

在 post 方法中发送标头

SwiftyDropbox 与 Alamofire 问题