在Alamofire中上传文件其实相比较AFN文件中难了很多,复杂了很多,应该是作者也为了保证链式响应这个特点,所以我们用起来就得一步一步跟着官方文档去做。代码如下
这里先附上官方文档对于文件上传的解释,第一个仅仅是上传了一个二进制数据,第二个是获取文件的url,然后把文件进行上传,第三个就是拼接二进制数据,然后再进行上传
解释下我们这里要上传文件的话就要去拼接数据,这里拼接数据是有讲究的,因为我们需要知道拼接数据是拼接文件还是说拼接和文件一起上传的字典的参数,如果我们是要上传文件的话append方法中就需要带有mimeType,如果我们要上传参数的话,比如说一些字符串就是选择不带mimeType的。因为我们如果知道文件上传的形式的话就会知道,如果我们上传的是上传文件携带的参数的话是没有Content-Type: #{mimeType}` (HTTP Header)的。而如果上传的是文件都是有Content-Type的,所以我们可以根据这个来判断
Alamofire.upload(multipartFormData: { (formData) in
//拼接上传文件的二进制数据
formData.append(data, withName: name, fileName: "picture", mimeType:"multipart/form-data")
//遍历参数字典,生产对应的参数数据
if let par = par
{
for (key,value) in par
{
let str = value as! String
//把字符串编码成二进制文件
let strData = str.data(using:String.Encoding.utf8)!
//拼接二进制数据
formData.append(strData, withName: key)
}
}
}, usingThreshold: (5*1024*1024), to: URL(string:URLString)!, method:HTTPMethod.post) { (encodingResult) in
switch encodingResult
{
case .success(let request,_,_):
request.responseJSON(completionHandler: { (response) in
//判断是否失败了
//判断是否发生了错误
if response.result.isFailure
{
print("网络请求失败 \(response.result.error)")
}
//根据返回的数据进行回调
finished(response.result.value, response.result.error)
})
case .failure(let error):
print("上传文件编码错误\(error)")
}
}