平台:iOS
开发语言:Swift
网络库:Alamofire
问题描述:用Alamofire的post请求将本地文件上传到oss(policy、signature、accessId等都是每次使用由服务器重新生成的)大部分时候正常,有的时候会报错“The body of your POST request is not well-formed multipart/form-data”。贴上charles截包图(第一张为上传成功,第二张为上传失败),望大神解答~
<Code>MalformedPOSTRequest</Code>
<Message>The body of your POST request is not well-formed multipart/form-data</Message>
<RequestId>5BFBEE7594D2DCB3BE2A0A76</RequestId>
<HostId>aijihui-dev.oss-cn-hangzhou.aliyuncs.com</HostId>
private func contentHeaders(withName name: String, fileName: String? = nil, mimeType: String? = nil) -> [String: String] {
var disposition = "form-data; name=\"\(name)\""
if let fileName = fileName { disposition += "; filename=\"\(fileName)\"" }
var headers = ["Content-Disposition": disposition]
// if let mimeType = mimeType { headers["Content-Type"] = mimeType }
return headers
}
我是直接修改源代码,把if let mimeType = mimeType { headers["Content-Type"] = mimeType }
这行注释掉
我是直接修改源代码,把 contentHeaders
方法里的 if let mimeType = mimeType { headers["Content-Type"] = mimeType }
这行注释掉
private func contentHeaders(withName name: String, fileName: String? = nil, mimeType: String? = nil) -> [String: String] {
var disposition = "form-data; name=\"\(name)\""
if let fileName = fileName { disposition += "; filename=\"\(fileName)\"" }
var headers = ["Content-Disposition": disposition]
// if let mimeType = mimeType { headers["Content-Type"] = mimeType }
return headers
}
问题解决了,是因为在file域里面Content-Type在Content-Disposition之前,因此出现了该问题,oss这里是需要Content-Type在Content-Disposition之后才可以正常的。
为什么Content-Type会在Content-Disposition之前,这是因为Alamofire处理表单域的时候是将Content-Disposition和Content-Type添加到一个字典中,然后遍历字典添加到表单域中的,但是由于字典是无序的,所以会出现有50%概率Content-Type在Content-Disposition之前。综合看了一下Alamofire源码,不建议直接修改源码,所以我自己用URLSession重写了个表单上传。
希望能帮到遇到同一个坑的攻城狮们。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。