【发布时间】:2015-08-19 11:40:03
【问题描述】:
我想使用multipart/form-data 类型的发布请求上传多个文件,并且对于每个文件,我需要知道服务器端的文件大小(内容长度)。
要在javascript 中构造POST 请求,我使用FormData 对象并将上传的文件对象附加到它。这工作正常,但除了 Content-Disposition 标头之外,每个部分仅添加了一个 Content-type 标头,但没有 Content-length 标头,尽管此信息可从各个 File 对象中获得。
有没有办法在发送请求时为FormData 对象的每个部分设置Content-length 标头?
以下是我使用的代码,包括我对问题的解决方法。它实际上使用angular-js 发送请求,但我认为这与问题无关。
var form = new window.FormData();
form.append('additional-field-1', new Blob(['some plain text'], {type : 'text/plain'}));
for (var file in fileList) {
var fileObj = fileList[file];
var count = 1 + parseInt(file, null);
form.append('file-size-' + count, new Blob([fileObj.size], {type : 'text/plain'}));
form.append('file-' + count, fileObj);
}
$http.post(url, form, {
transformRequest: angular.identity,
headers: {'Content-Type': undefined}
}).success(.....
【问题讨论】:
-
为此增加了赏金,这对我来说也很痛苦。
-
我打算使用 Angular 来形成请求 xD
-
您能解释一下为什么需要这个吗?通常,服务器端代码通过查找边界分隔符、解析标头等来计算多部分数据中每个“部分”的大小——剩下的就是数据。出于某种原因,您是否需要在解析每个“部分”的主体之前知道每个部分的大小?
-
我不认为这是可能的。 Angular 使用原生浏览器的功能来序列化和发送 HTTP 请求。 Content-Type 和 Content-Disposition 由浏览器设置,而不是 Angular。
-
好吧,tools.ietf.org/html/rfc2046 说“唯一定义了正文部分含义的标题字段是那些名称以'Content-'开头的字段”。这意味着添加内容长度标头是有效的,但 HTML5 FormData 类似乎不允许您这样做。该类实际上只是在进行多部分编码,因此您可以使用替代方法,但我无法通过简短的搜索找到符合您要求的方法。
标签: javascript angularjs multipartform-data multipart form-data