Swift - “Alamofire.upload” -> “AF.upload” 上传功能问题

Posted

技术标签:

【中文标题】Swift - “Alamofire.upload” -> “AF.upload” 上传功能问题【英文标题】:Swift - "Alamofire.upload" -> "AF.upload" issue with the Upload function 【发布时间】:2020-07-10 04:30:12 【问题描述】:

我已经从旧版本升级了 pod Alamofire 5.0,

来自迁移指南 https://github.com/Alamofire/Alamofire/blob/master/Documentation/Alamofire%205.0%20Migration%20Guide.md

“MultipartFormData 的 API 发生了变化,创建和上传 MultipartFormData 的***上传方法已更新以匹配其他请求 API,因此不再需要处理多部分编码的 Result。”

我写了下面的函数,我无法在新版本中重写这个函数,有人可以在这方面帮助我吗?

注意: 我认为我需要更改“Alamofire.upload”->“AF.upload”,但它不足以解决问题,

func uploadPhoto(token:String, userID: String, data: Data, dataUrl: URL) -> Observable<AnyObject?> 
        return Observable<AnyObject?>.create( (observer) -> Disposable in
            print(userID);
            print(data);
            
            do 
                let urlRequest = try URLRequest(url: ResourcePath.Upload.path + "/\(userID)" , method: .post)
                Alamofire.upload(multipartFormData:  (multipartData) in
                    multipartData.append(data, withName: "Filedata", fileName: dataUrl.absoluteURL.lastPathComponent, mimeType: "image/jpeg")
                    //append(dataUrl, withName:  "Filedata",  fileName: dataUrl.absoluteString, mimeType: "image/png")
                    
                , with: urlRequest, encodingCompletion:  (result) in
                    switch result 
                    case .success(let value, let t1, let t2) :
                        print(value)
                        value.responseData(completionHandler:  (dataResponse) in
                            switch (dataResponse.result) 
                            case .success(let value) :
                                print(value)
                                do 
                                    
                                   
                                    let jsonData = JSON(dictData)
                                    print("Upload photo response: \(jsonData)")
                                    observer.onNext(jsonData as AnyObject?)
                                    observer.onCompleted()
                                
                                catch 
                                    print(error)
                                    observer.onError(error)
                                    return
                                
                                break
                            case .failure(let error) :
                                print(error)
                                observer.onError(error)
                                break
                            
                        )
                        
                        break
                    case .failure(let error) :
                        print(error)
                        observer.onError(error)
                        break
                    default:
                        break
                    
                )
             catch 
                print(error)
                observer.onError(error)
            
            return Disposables.create 
                print("disposed")
            
        )
    

【问题讨论】:

您希望有人重写您的代码而不自己尝试吗?我认为这不是一个好主意。 你试过用 AF.upload 代替 Alamofire.upload 吗? 我不知道如何进行更改 Af.upload 不起作用 我收到一个错误“表达式类型 'UploadRequest' 在没有更多上下文的情况下不明确” 【参考方案1】:

Alamofire 5 在使用多部分表单编码时不再需要 encodingCompletion 闭包。相反,您可以使用在其他用例中看到的正常响应处理。例如:

AF.upload(multipartFormData:  data in
    // Build your multipart form.
).responseDecodable(of: SomeType.self)  response in
    // Handle response.

【讨论】:

以上是关于Swift - “Alamofire.upload” -> “AF.upload” 上传功能问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift Alamofire 发送图像数组和其他参数

Alamofire 4 swift 3 上传带有标题的 MultipartFormData 未发布

如何使用参数 swift 3.0 Alamofire 4.0 调用邮政服务?

尝试从响应 Swift Alamofire 将数据保存到核心数据时崩溃

Alamofire 5 没有名为 upload 的成员

使用 Swift 将照片上传到网络服务