开发者社区> 问答> 正文

oss表单直传,The body of your POST request is not well-formed multipart/form-data

tt0817 2018-11-26 22:20:20 1505

平台: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> 

对象存储 Swift iOS开发
分享到
取消 提交回答
全部回答(2)
  • beeplatform
    2019-07-17 23:16:33
        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
        }
    0 0
  • tt0817
    2019-07-17 23:16:33

    问题解决了,是因为在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重写了个表单上传。
    希望能帮到遇到同一个坑的攻城狮们。
    1543456288477
    1543456282889
    1543456271700

    1 0
添加回答

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题