这是我要发送到服务器的数据的结构:
{
attachment: [File],
foo: String,
bar: String
}
如您所见,我正在尝试发送文件数组以及一些其他数据。为了存储所有这些数据,我使用了JavaScript官方API中提供的FormData()
构造函数。我这样填充formData
:
for (let i = 0; i < this.state.files.length; i++) {
let f = this.state.files[i];
this.formData.append('attachment', f, f.name);
}
this.formData.append('foo', this.state.foo);
this.formData.append('bar', this.state.bar);
旁注:使用React,react-dropzone
上传文件。
我现在正在尝试将此数据提交到服务器。我首先尝试像这样使用Fetch API:
fetch(url, {
method: method,
body: data,
headers: {
...authHeader(authToken)
}
}
没有太多成功。方法是POST
。 authHeader(authToken)
仅生成Authorization: Bearer ...
。问题是我认为要指定的标头被我的身份验证标头覆盖。
因此,我尝试使用request
和request-promise-native
。我做了类似的事情:
rp({
url,
method,
headers: {
...authHeader(authToken)
},
formData: data
});
具有相似的结果。通过授权标头和来自FormData
的文件数组发送此类数据的正确方法是什么?
答案 0 :(得分:1)
这是获取对象中可用的选项
image.jpg
如果您需要向服务器发送一些自定义标头,只需将其写为:
fetch(url, {
method: "POST", // *GET, POST, PUT, DELETE, etc.
mode: "cors", // no-cors, cors, *same-origin
cache: "no-cache", // *default, no-cache, reload, force-cache, only-if-cached
credentials: "same-origin", // include, *same-origin, omit
headers: {
"Content-Type": "application/json",
// "Content-Type": "application/x-www-form-urlencoded",
},
redirect: "follow", // manual, *follow, error
referrer: "no-referrer", // no-referrer, *client
body: JSON.stringify(data), // body data type must match "Content-Type" header
})
由于您要发送多部分形式的数据,因此只需将数据添加到请求的主体中,如下所示:
headers: {
"My-Custom-Header": "Custom-Header-Value",
}
如果您将字段包含在表单标签中,则可以这样设置表单数据:
body: formData
如果您使用的是http身份验证,则有不同的身份验证方案,请使用此链接供参考 https://developer.mozilla.org/en-US/docs/Web/HTTP/Authentication
如果您使用的是基本授权,则应使用以下内容:
var formData = new FormData(document.querySelector("form"));
答案 1 :(得分:0)
为了将来参考,我设法通过以下配置发送数据:
fetch(url, {
method: method,
body: data,
headers: {
'Accept': 'application/json',
...authHeader(authToken)
}
})
也就是说,通过Accept
标头似乎已经解决了该问题。另请注意,Content-Type
标头未设置,允许浏览器自行设置。