【问题标题】:Swift 3 Alamofire multipart uploadSwift 3 Alamofire 分段上传
【发布时间】:2017-01-28 06:14:01
【问题描述】:

由于迁移到 Swift 3,我发现很难编译使用 Alamofire 的项目。

上传multipartFormData时出现问题:

Alamofire.upload(.POST, URL, headers: headers, multipartFormData: {
        multipartFormData in
.
.
. 
}) 

对成员'upload(_:to:method:headers:)'的模糊引用

非常感谢任何帮助,在此先感谢!

已解决:

 Alamofire.upload(multipartFormData: { (multipartFormData) in

        multipartFormData.append(fileData, withName: "file_pack", fileName: "file_pack", mimeType: "text/plain")


        for (key, value) in self.parameters {
            multipartFormData.append(value.data(using: String.Encoding.utf8)!, withName: key)
        }
        }, with: URL2, encodingCompletion: { (result) in

            switch result {
            case .success(let upload, _, _):

                upload.responseJSON { response in
                    self.delegate?.showSuccessAlert()
                    print(response.request)  // original URL request
                    print(response.response) // URL response
                    print(response.data)     // server data
                    print(response.result)   // result of response serialization
                    //                        self.showSuccesAlert()
                    self.removeImage("frame", fileExtension: "txt")
                    if let JSON = response.result.value {
                        print("JSON: \(JSON)")
                    }
                }

            case .failure(let encodingError):
                self.delegate?.showFailAlert()
                print(encodingError)
            }

    })

这就是在 Swift 3 中应该如何实现上传方法

【问题讨论】:

  • 方法签名已更改。评论您现有的,让 Xcode 的自动完成功能指导您编写新的。
  • 你也可以去 gitub 上的 alamofire。 github.com/Alamofire/Alamofire

标签: ios swift networking alamofire swift3


【解决方案1】:

对于 Swift 3 和 Alamofire ~4.3.0

如果像我这样的人尝试同步获取请求对象(不使用锁或 dispatch_groups),您可以使用这种方法:

// outer function
...
let string = "string to send"
let multipartFormData = MultipartFormData()
multipartFormData.append(string.data(using: .utf8)!, withName: "str")

guard let data = try? multipartFormData.encode() else {
    // fail appropriately
}

let request = sessionManager.upload(data,
                                    to: url,
                                    method: .post,
/* this is VERY IMPORTANT LINE */   headers: ["Content-Type" : multipartFormData.contentType])

request.validate()
// do whatever you need with request

请注意,您需要从multipartFormData 设置Content-Type 标头,因为它包含边界。

如果你不需要让你的请求对象同步另一个答案

Alamofire.upload(multipartFormData: { (multipartFormData) in

按预期工作。如果数据编码成功,它将在回调闭包中返回您的请求对象。

重要提示:如果你使用我描述的方法,它会阻塞你的线程(在大多数情况下你可能在主线程中)来复制和编码你的数据。所以不要将它用于大文件或其他任何东西。它是故意在 Alamofire 中异步的。

【讨论】:

  • sessionManager 来自哪里?
  • @Arbitur 它是用于发出请求的 Alamofire.SessionManager 的一个实例。在我的生产代码中,它在应用程序初始化并在整个应用程序中使用时创建一次。在这个来自答案的特定 sn-p 中,它可以在 //outer 函数之后标记为“...”的代码中创建。尽管如此,在哪里为这个 sn-p 创建会话管理器并不相关。
【解决方案2】:

在 swift 3 中,尝试按照@DCDC 在他的解决方案中指出的那样设置 multipartFormData。 XCode 尝试在 .data() 之前强制转换为 AnyObject,所以不是

value.data(using: String.Encoding.utf8)!, withName: key

我做到了

[replace_your_var_name_here].data(using: String.Encoding.utf8)!, withName: key

在我的情况下,我的 var 列表并不大,所以硬编码是一种选择。

【讨论】:

    【解决方案3】:

    试试这个,网址设置为@pedrouan说的。

    Alamofire.upload(multipartFormData: { (multipartFormData) in
           multipartFormData.append(imageData, withName: "xyz", fileName: "file.jpeg", mimeType: "image/jpeg")
    }, to: url) 
    { (result) in
          //result
    }
    

    【讨论】:

      【解决方案4】:

      例如,在 Swift 3 中使用 Alamofire 4.0.0

      (确保您已准备好 4.0.0,因为您似乎还没有更新您的 Alamofire)

      Alamofire.upload(multipartFormData: { (multipartFormData) in
              // code
          }, to: URL, encodingCompletion: { (result) in
              // code
          })
      

      Alamofire.upload(multipartFormData: { (multipartFormData) in
              // code
          }, with: URL, encodingCompletion: { (result) in
              // code
          })
      

      所以headers需要通过URL请求传递:

      let URL = try! URLRequest(url: "http://example.com", method: .get, headers: headers)
      

      【讨论】:

      • 还有一个问题,第一个占位符(multipartFormData in)应该放什么代码,后者应该放什么(结果)?以前只有一个关闭
      • 不强制填写代码,闭包是供你最终使用的。但我想,完成闭包在您获得反馈时很有用,因为它是异步方法。
      • @DCDC 你的 Alamofire 好像没有更新到 4.0.0
      • 这仍然对我不起作用.....还有其他人吗?不知道还能做什么。
      猜你喜欢
      • 2018-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-10
      • 2019-09-01
      • 2019-01-26
      • 2017-03-13
      相关资源
      最近更新 更多