你没有设置boundary
在您的请求标头中,如下所示:
request.setRequestHeader("Content-Type", "multipart/form-data; boundary=l3iPy71otz");
有关更多信息,请参阅RFC 2045:
5 内容类型头字段
[…]
参数是媒体的修饰符
子类型,因此不
从根本上影响事物的性质
内容。有意义的一组
参数取决于媒体类型
和子类型。大多数参数是
与单个特定的
亚型。然而,给定
顶级媒体类型可以定义
适用于的参数
该类型的任何子类型。参数
可能需要他们的定义
内容类型或子类型或者它们可能是
选修的。 MIME 实现必须
忽略其名称的任何参数
不认识。
例如,“字符集”
参数适用于任何子类型
“文本”,同时“边界”
任何子类型都需要参数
“多部分”媒体类型。
Update:我发现的另一个问题网络上当出现charset
被添加到Content-type
在请求标头中,但不在正文的消息边界中(对于您的测试用例也是如此)。这似乎不是一个可能的解决方案,但也许有帮助。
在您的情况下,明确添加charset
在请求标头和消息边界中:
data.params += "--" + data.uniqid + "; charset=UTF-8" + data.crlf;
…
request.setRequestHeader("Content-Type", "multipart/form-data; boundary=" + data.uniqid + "; charset=UTF-8");
更新2:在本地尝试此操作后,我注意到前导边界未被识别为这样,而是被解释为最后一个参数内容(在我更宽容的服务器上)。也许这导致阿帕奇抛出了一个400 Bad Request
error.
经过一番尝试和错误后,我注意到这是因为服务器期望charset
将在every边界,甚至是最后一个。为了防止混淆,我决定明确设置charset
在请求头中before边界参数,因此边界将是最后一个参数Content-type
请求标头。在此之后,一切似乎都很顺利。
data.params = "Content-Type: multipart/form-data; boundary=" + data.uniqid;
…
data.params += "--" + data.uniqid + data.crlf;
…
data.params += "--" + data.uniqid + "--";
…
request.setRequestHeader("Content-Type", "multipart/form-data; charset=UTF-8; boundary=" + data.uniqid);