【发布时间】:2015-05-08 06:58:36
【问题描述】:
我有一个 API 端点,我必须向它发送一个多部分 HTTP 请求,该请求由两部分组成,file(一个文件系统文件)和data(一个 JSON 对象)。
经过一番研究,我发现了如何在 AngularJS 中执行多部分请求:
$http({
method: 'POST',
url: url,
headers: {
'Content-Type': 'multipart/form-data'
},
data: {
data: model,
file: file
},
transformRequest: customFormDataObject
});
1) customFormDataObject 函数最初具有以下形式:
customFormDataObject formDataObject = function (data, headersGetter) {
var fd = new FormData();
angular.forEach(data, function (value, key) {
fd.append(key, value);
});
var headers = headersGetter();
delete headers['Content-Type'];
return fd;
};
此实现的结果是请求的各个部分没有设置contentType。
2) 在阅读了更多内容 (https://stackoverflow.com/a/24535293/689216) 之后,我尝试为此使用 Blob,customFormData 对象看起来像这样(有点乱,基本上第一部分是contentTypeapplication/json,第二部分是image/png):
customFormDataObject = function (data, headersGetter) {
var fd = new FormData();
var contentType = 'application/json';
angular.forEach(data, function (value, key) {
fd.append(key, new Blob([JSON.stringify(value)], {
type: contentType
}));
contentType = 'image/png';
});
var headers = headersGetter();
delete headers['Content-Type'];
return fd;
};
第二种方法为请求的每个部分设置正确的contentType,但它没有为这些部分设置任何值。
基本上发生的情况是 1) 在多部分中设置了正确的值,但未设置 contentType。使用 2) 会设置 contentType,但不会设置多部分的值。
我错过了什么吗?这个功能不应该像这样工作吗?
谢谢!
【问题讨论】:
-
您是否尝试过根据请求设置内容类型而不是每个表单数据元素?
-
是的,在执行
delete headers['Content-Type'];时会自动设置请求的内容类型 -
file已经是Blob和JSON.stringify不会序列化文件的内容,而是序列化file的属性(如果有的话)。
标签: angularjs multipartform-data multipart