[英]Swift 3 Alamofire multipart upload
由于迁移到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在他的解决方案中指出。 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
如果像我这样的人试图同步获取请求对象(不使用lock或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中异步。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.