Swift 3 Alamofire分段上传

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

上传multipartFormData时发生问题:

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

模糊引用成员上传(_: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中实现上传的方法

例如,在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) 

试试这个和URL设置为@ pedrouan说。

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

在swift 3中,试图将multipartFormData设置为@DCDC在他的解决scheme中指出。 XCode尝试在.data()之前强制转换为AnyObject,而不是

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

我做了

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

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

对于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 

按预期工作。 在数据成功编码的情况下,它将在callbackclosures中返回请求对象。

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