开发者社区> 问答> 正文

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

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

展开
收起
tt0817 2018-11-26 22:20:20 15526 0
3 条回答
写回答
取消 提交回答
  • 狗叼滴,拼凑body时前面多了一行空格导致报这个错误,让我找了一下午,我太难了

    2020-04-27 19:38:20
    赞同 1 展开评论 打赏
  •     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
        }
    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

    2019-07-17 23:16:33
    赞同 1 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
OSS运维进阶实战手册 立即下载
《OSS运维基础实战手册》 立即下载
OSS运维基础实战手册 立即下载