XMLHttpRequest multipart/form-data: 多部分数据中的边界无效。

9
我通过XMLHttpRequest发送 POST 数据:
var xmlHttp=new XMLHttpRequest();
xmlHttp.open("POST", domain, true);
xmlHttp.setRequestHeader("Content-type","multipart/form-data");
var formData = new FormData();  
formData.append("data", data_json_string);
xmlHttp.send(formData);

在Python中,如果我尝试获取POST(或FILES或任何其他)数据,则会出现错误:
MultiPartParserError: Invalid boundary in multipart: None

这个能行吗?难道我真的需要将表单体作为一个字符串创建,在循环遍历参数并在每个参数前后放置一个边界字符串吗?如果是这样,那么它应该是什么样子的?我如何从Python的POST中获取它?或者是否有更简单的方法。我正在四处寻找,但没有找到太多相关信息。
顺便说一下,我正在使用“multipart/form-data”,因为我的字符串数据非常长,这是一种更快的发送方式。当我创建一个表单并将其定位到一个iframe时,它对我有效。但是这里我更喜欢xmlHttp。
1个回答

14
不要自己设置Content-Type头信息,当使用 .send() 发送数据时它将被正确设置,包括正确生成的边界字符串,而手动生成的头部信息则缺少这些内容。 规范明确指出 .send(FormData) 方法会使用 multipart/form-data 编码。

如果 data 是 FormData

让请求实体主体成为使用 UTF-8 作为明确字符编码、使用 data 作为表单数据集运行 multipart/form-data 编码算法的结果。

让 mime 类型成为 "multipart/form-data;"、U+0020 SPACE 字符和由 multipart/form-data 编码算法生成的多部分/form-data 边界字符串的串联。


我担心它正在进行URI编码,从而使其变长。当通过表单发送时,这是一个问题,设置头部会有很大的区别。但也许在xmlHttp中不会发生这种情况? - user984003
哇,我觉得这是不常见的知识。就我所知,没有任何主要的前端JS框架提到它。 - Nostalg.io

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接