获取分段上传 Alamofire 5 的上传进度

Posted

技术标签:

【中文标题】获取分段上传 Alamofire 5 的上传进度【英文标题】:Get upload progress for multipart upload Alamofire5 【发布时间】:2020-06-15 08:00:01 【问题描述】:

在 Alamofire5 之前,我们可以使用 uploadRequest 的 encodingReesult 来获取 uploadProgress。 但是现在将 Alamofire 上传到版本 5 后,基于Alamofire Documentation,我们可以使用.uploadProgress 来获取上传进度处理程序。

这是我的代码:

AF.upload(multipartFormData:  multipartFormData in
            multipartFormData.append(fileContent, withName: "file", fileName: filePath.lastPathComponent)
            multipartFormData.append(token.data(using: .utf8)!, withName: "token")
        , to: uploadURL)
        .uploadProgress  progress in 
            print(progress)
        
        .responseJSON  [weak self] response in
            print(response)
        

但在上传过程中从未调用uploadProgress 闭包。

我检查了很多*** 问题,但没有一个有用。

【问题讨论】:

我还是找不到答案。在 alamofire 单元测试中,有一个名为“executeMultipartFormDataUploadRequestWithProgress”的方法,用于检查是否有任何上传进度。没有自己做测试。但它应该适用于 multipartFormData。 downloadProgress 虽然有效。上传成功结束,下载进度返回值“1”。只有 uploadProgress 闭包没有被调用。响应回调也有效。 我在答案中发布了“我的修复”。 【参考方案1】:

如果您碰巧安装了用于网络流量调试的库,例如Wormholy,那么,请查看this issue thread。简而言之,这是库和卸载它的问题,解决了问题。虽然不确定其他网络调试器。为了清楚起见,尝试在一个新的、干净的项目中进行测试,看看 alamofire 是否在这样的环境中工作。

【讨论】:

是的,我使用 Wormholy 网络调试器。聪明的回答。让我检查它是否有效【参考方案2】:

更换你的

.uploadProgress  progress in 
            print(progress)
        

.uploadProgress(closure:  (progress) in
print("Upload Progress: \(progress.fractionCompleted)")
)

它会给你输出:

Upload Progress: 0.035203331252732804
Upload Progress: 0.035203331252732804
Upload Progress: 0.0528049968790992
Upload Progress: 0.088008328131832
Upload Progress: 0.1584149906372976
Upload Progress: 0.2112199875163968
Upload Progress: 0.2288216531427632
Upload Progress: 0.24642331876912962
Upload Progress: 0.24642331876912962
Upload Progress: 0.24642331876912962
Upload Progress: 0.24642331876912962
Upload Progress: 0.24642331876912962
Upload Progress: 0.24642331876912962
Upload Progress: 0.24642331876912962

编辑:

AF.upload(multipartFormData:  MultipartFormData in
        MultipartFormData.append(fileContent, withName: "file" , fileName: filePath.lastPathComponent , mimeType: "image/jpeg")
        for(key,value) in dictonary 
            MultipartFormData.append(token.data(using: String.Encoding.utf8)!, withName: "token")
        
    , to: uploadURL, method: .post, headers: ["Content-Type": "application/json")

        .uploadProgress(closure:  (progress) in
            print("Upload Progress: \(progress.fractionCompleted)")
        )

        .responseJSON (response) in
            debugPrint("SUCCESS RESPONSE: \(response)")
         

【讨论】:

对我不起作用。可能有一些队列调度问题 @AliMoazenzadeh 你在主线程上运行那个调用吗?你确定你需要在参数中发送token 而不是header 从这一行multipartFormData.append(token.data(using: .utf8)!, withName: "token") 是的,我确定。令牌用于文件而不是标题。我正在主线程上运行代码 您是否在 swagger 或 Postman 上尝试过您的 API 以检查其工作情况?如果一切正常并且在这些和后端站点上工作,请尝试我在上面的帖子(已编辑)中添加的代码,以便您更改 AF 调用。 @AliMoazenzadeh 是的,服务器工作正常,每次上传完成时都会执行 responseJSON 块。服务器是否需要任何额外的标头来支持进度?我自己不这么认为@darklegend【参考方案3】:

我也有这个问题。 我尝试通过多种方法解决它。 最后,我卸载了 pod “CocoaDebug”。 有效。 所以我认为可能是 CocoaDebug 扰乱了网络。

【讨论】:

以上是关于获取分段上传 Alamofire 5 的上传进度的主要内容,如果未能解决你的问题,请参考以下文章

Swift中的Alamofire分段上传帖子错误

Alamofire 上传进度

如何在 Alamofire 4.0 中添加带有上传进度百分比的标签的进度条

如何使用 alamofire 上传多个文件并显示进度?

使用 alamofire 的顺序上传/串行队列

在异步函数上同时获取进度和错误操作