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

Posted

技术标签:

【中文标题】如何在 Alamofire 4.0 中添加带有上传进度百分比的标签的进度条【英文标题】:How I can add progress bar with label with percentage of progress of upload in Alamofire 4.0 【发布时间】:2016-12-31 12:01:18 【问题描述】:

我正在尝试通过 Alamofire 4.0 将视频上传到服务器,我想添加进度条以显示上传过程中上传过程的百分比,我如何通过与 Alamofire 上传相同的功能来做到这一点。

我的上传功能代码:

Alamofire.upload(multipartFormData:  multipartFormData in



                        multipartFormData.append(url.absoluteURL!, withName: "videoFile", fileName: "alaa", mimeType: "mov")
                        multipartFormData.append("video".data(using: .utf8)!, withName: "load")
                        multipartFormData.append("record".data(using: .utf8)!, withName: "type")


                    , with: URL, encodingCompletion:  (result) in
                        // code
                        print("uploaded")
                    )

【问题讨论】:

【参考方案1】:

直接引用 AlamoFire 文档:

上传进度

当您的用户等待上传完成时,有时它 可以方便地向用户显示上传进度。任何 UploadRequest 可以同时报告上传进度和下载进度 使用 uploadProgress 和 downloadProgress API 的响应数据。

let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov")

Alamofire.upload(fileURL, to: "https://httpbin.org/post")
    .uploadProgress  progress in // main queue by default
        print("Upload Progress: \(progress.fractionCompleted)")
    
    .downloadProgress  progress in // main queue by default
        print("Download Progress: \(progress.fractionCompleted)")
    
    .responseJSON  response in
        debugPrint(response)
    

【讨论】:

这一行视频的网址在哪里? let fileURL = Bundle.main.url(forResource: "video", withExtension: "mov") 意思是在你的主包中获取一个名为 video.mov 的文件的 URL。 这是示例代码,而不是特定于您的问题的代码。该行为来自应用程序包的名为“video.mov”的文件创建了一个文件 url。 @DuncanC 你知道 downloadProgress 在这个例子中做了什么吗?找了一阵子,看了看AlamoFire的代码,想不通。是服务器响应的下载进度吗?【参考方案2】:

请检查。

            var imgData = Data()
            if image != nil 

                imgData = UIImageJPEGRepresentation(image!, 1.0)!
            

            Alamofire.upload(multipartFormData: multipartFormData in
                multipartFormData.append(imgData, withName: "image", fileName: "imagefilename", mimeType: "image/jpeg")

                for (key, value) in param 

                    //let data = (value as! String).data(using: String.Encoding.utf8)!
                    let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue)
                    multipartFormData.append(data!, withName: key as! String)
                
            ,
                             usingThreshold:UInt64.init(),
                             to:fullLink,
                             method:.post,
                             headers:[:],
                             encodingCompletion:  encodingResult in

                                switch encodingResult 

                                case .success(let upload, _, _):

                                    upload.uploadProgress  progress in // main queue by default

                                        print("Upload Progress: \(progress.fractionCompleted)")
                                    

                                    upload.responseJSON  response in

                                        debugPrint(response)

                                        if let TempresponseDict:NSDictionary = response.result.value as? NSDictionary 

                                            if (TempresponseDict.object(forKey: "response") as? String)?.caseInsensitiveCompare("success") == .orderedSame 

                                                CompletionHandler(true, TempresponseDict)
                                            
                                            else 

                                                var statusCode = response.response?.statusCode

                                                if let error = response.result.error as? AFError 

                                                    statusCode = error._code // statusCode private

                                                    switch error 

                                                    case .invalidURL(let url):
                                                        print("Invalid URL: \(url) - \(error.localizedDescription)")
                                                    case .parameterEncodingFailed(let reason):
                                                        print("Parameter encoding failed: \(error.localizedDescription)")
                                                        print("Failure Reason: \(reason)")
                                                    case .multipartEncodingFailed(let reason):
                                                        print("Multipart encoding failed: \(error.localizedDescription)")
                                                        print("Failure Reason: \(reason)")
                                                    case .responseValidationFailed(let reason):
                                                        print("Response validation failed: \(error.localizedDescription)")
                                                        print("Failure Reason: \(reason)")

                                                        switch reason 

                                                        case .dataFileNil, .dataFileReadFailed:
                                                            print("Downloaded file could not be read")
                                                        case .missingContentType(let acceptableContentTypes):
                                                            print("Content Type Missing: \(acceptableContentTypes)")
                                                        case .unacceptableContentType(let acceptableContentTypes, let responseContentType):
                                                            print("Response content type: \(responseContentType) was unacceptable: \(acceptableContentTypes)")
                                                        case .unacceptableStatusCode(let code):
                                                            print("Response status code was unacceptable: \(code)")
                                                            statusCode = code
                                                        
                                                    case .responseSerializationFailed(let reason):

                                                        print("Response serialization failed: \(error.localizedDescription)")
                                                        print("Failure Reason: \(reason)")
                                                        // statusCode = 3840 ???? maybe..
                                                    

                                                    print("Underlying error: \(error.underlyingError)")
                                                
                                                else if let error = response.result.error as? URLError 

                                                    print("URLError occurred: \(error)")
                                                
                                                else 

                                                    print("Unknown error: \(response.result.error)")
                                                

                                                print("\(statusCode)") // the status code

                                                CompletionHandler(false, TempresponseDict)
                                            
                                        
                                        else 

                                            CompletionHandler(false, NSDictionary())
                                        
                                    

                                case .failure(let encodingError):

                                    print(encodingError)
                                    CompletionHandler(false, NSDictionary())
                                
            )
        

【讨论】:

fullLink 我必须把它作为字符串或 urlrequest 因为在第二种情况下它给我 null 所以视频不会上传 ,这部分我不明白,如果我有 2 个参数,如上面的代码,我该如何处理。 for (key, value) in param //let data = (value as!String).data(using: String.Encoding.utf8)! let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue) multipartFormData.append(data!, withName: key as!String) fullLink = String for (key, value) in param //let data = (value as!String).data(using: String.Encoding.utf8)! let data = (value as AnyObject).data(using: String.Encoding.utf8.rawValue) multipartFormData.append(data!, withName: key as!String) 你的场景不需要这段代码。 您可以用您的数据将此行写入 2 次。 multipartFormData.append(imgData, withName: "image", fileName: "imagefilename", mimeType: "image/jpeg")

以上是关于如何在 Alamofire 4.0 中添加带有上传进度百分比的标签的进度条的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中使用 Alamofire 上传带有 JSON 参数的图像?

上传时 Alamofire 4.0 模棱两可的参考

如何在 Alamofire 4.0 中仅使用参数和正文在 swift 中使用 POST 方法发送请求?

尝试通过 Alamofire 4.0 上传图像时,类型“ParameterEncoding”没有成员“URL”

如何上传带有 Alamofire 内部参数的图像

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