javascript - 在多部分/表单数据上传的各个部分设置内容长度 header

标签 javascript angularjs multipartform-data multipart form-data

我想使用 multipart/form-data 类型的发布请求上传多个文件,对于每个文件,我需要知道服务器端的文件大小(内容长度)。

为了在 javascript 中构造 POST 请求,我使用了一个 FormData 对象,并将要上传的 File 对象附加到它。这工作正常,但是除了 Content-Disposition header 之外,每个部分只添加了一个 Content-type header ,但没有 Content-length header ,尽管此信息可从各个文件对象中获得。

有没有办法实现在发送请求时为 FormData 对象的每个部分设置 Content-length header ?

下面是我使用的代码,包括我解决问题的方法。它实际上使用 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(.....

最佳答案

我认为没有办法为每个表单数据元素实际添加自定义 header 。但是,为什么不将它作为文件名的一部分添加到内容配置 header 中:

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--

关于javascript - 在多部分/表单数据上传的各个部分设置内容长度 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32094485/

相关文章:

javascript - 如何在Aframe webvr中动态添加标签

javascript - Angular-ui/ui-router 嵌套状态不继承自定义数据

PHP - Curl - 带有应用程序/八位字节流的多部分/表单数据用于空白文件

iphone - 多部分图像的 ALAMOFIRE 响应图像数据

java - 如何在 Java 中对 InputStream 进行 HTTP POST

javascript - 如何在 HighchartJS 中禁用近似?

javascript - JS悬停链接调用函数,但只有一次?

javascript - 在 Javascript 中链接可视化库

javascript - 无法在 Jasmine-karma 的 POST 时模拟 $httpbackend

javascript - AngularJS $watch 无法在 if block 中工作