【问题标题】:Set content-length header on individual parts of a multipart/form-data upload在多部分/表单数据上传的各个部分设置内容长度标头
【发布时间】: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


【解决方案1】:

我不相信有一种方法可以为每个表单数据元素实际添加自定义标题。但是,为什么不将它作为文件名的一部分添加到内容处置标头:

data = new FormData();
data.append('additional-field-1', new Blob(['some plain text'], {type : 'text/plain'}));

for (var i = 0; i< $( '#file' )[0].files.length; i++) {
   var fileObj = $( '#file' )[0].files[i];
   data.append( '{ size : ' + fileObj.size + ' }' , $( '#file' [0].files[i], $( '#file' )[0].files[i].name );
}

我不确定你是如何在服务器上处理这个的,但请求看起来像这样:

------WebKitFormBoundarysZxMHYOzMkqDmOvR
Content-Disposition: form-data; name="additional-field-1"; filename="blob"
Content-Type: text/plain


------WebKitFormBoundarysZxMHYOzMkqDmOvR
Content-Disposition: form-data; name="{ size : 22984 }"; filename="MatrixArithmetic.vshost.exe"
Content-Type: application/x-msdownload


------WebKitFormBoundarysZxMHYOzMkqDmOvR
Content-Disposition: form-data; name="{ size : 187 }"; filename="MatrixArithmetic.vshost.exe.config"
Content-Type: application/xml


------WebKitFormBoundarysZxMHYOzMkqDmOvR--

【讨论】:

  • 所以我遇到的问题是试图复制 Java 开发人员将标头信息硬编码到原始帖子中的功能,并且似乎无法在此处复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2011-03-16
  • 2013-05-01
  • 2016-11-03
相关资源
最近更新 更多