无法使用 fetch 发送多部分,但 axios 工作正常
can't send multipart with fetch but axios works fine
这是我的代码:
function uploadImage(payload) {
return fetch('/api/storage/upload/image/', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
Accept: 'application/json',
Authorization: 'Bearer <token>',
},
body: payload,
});
}
function uploadImage2(payload) {
return axios.post('/api/storage/upload/image/', payload, {
headers: {
'Content-Type': 'multipart/form-data',
Accept: 'application/json',
Authorization: 'Bearer <token>',
},
});
}
function test(file, meta_data) {
var formBody = new FormData();
formBody.set('image', file);
formBody.set('meta_data', meta_data);
uploadImage(formBody);
// doesn't work
uploadImage2(formBody);
// works
}
有人可以向我解释一下我应该如何使用 fetch 发送多部分请求吗?
我用这段代码得到的错误是:400 bad request, file and meta_data are null.
以下是对我有用的方法:
function uploadImage(payload) {
return fetch('/api/storage/upload/image/', {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
},
body: payload,
});
}
通过对比浏览器发送的cURL请求发现axios请求中有这样的:
"Content-Type": "multipart/form-data; boundary=---------------------------19679527153991285751414616421",
所以我认为,当您手动指定内容类型时,fetch 会遵守该内容类型并且不会触及任何内容,同时仍然按照它想要的方式进行:-/ 所以您不应该指定它,fetch 会知道本身,因为您正在使用 formData()
不要使用此 header:'Content-Type': 'multipart/form-data'
。
删除 header 它应该可以工作。
解释:
将 fetch
与 'Content-Type' 一起使用时:'multipart/form-data' 您还必须设置 boundary
(请求中发送的字段之间的分隔符) .
没有边界,接收请求的服务器将不知道字段从哪里开始和结束。
您可以自己设置边界,但最好让浏览器通过完全删除 'Content-Type'
header 自动设置。
这是我的代码:
function uploadImage(payload) {
return fetch('/api/storage/upload/image/', {
method: 'POST',
headers: {
'Content-Type': 'multipart/form-data',
Accept: 'application/json',
Authorization: 'Bearer <token>',
},
body: payload,
});
}
function uploadImage2(payload) {
return axios.post('/api/storage/upload/image/', payload, {
headers: {
'Content-Type': 'multipart/form-data',
Accept: 'application/json',
Authorization: 'Bearer <token>',
},
});
}
function test(file, meta_data) {
var formBody = new FormData();
formBody.set('image', file);
formBody.set('meta_data', meta_data);
uploadImage(formBody);
// doesn't work
uploadImage2(formBody);
// works
}
有人可以向我解释一下我应该如何使用 fetch 发送多部分请求吗?
我用这段代码得到的错误是:400 bad request, file and meta_data are null.
以下是对我有用的方法:
function uploadImage(payload) {
return fetch('/api/storage/upload/image/', {
method: 'POST',
headers: {
Authorization: 'Bearer <token>',
},
body: payload,
});
}
通过对比浏览器发送的cURL请求发现axios请求中有这样的:
"Content-Type": "multipart/form-data; boundary=---------------------------19679527153991285751414616421",
所以我认为,当您手动指定内容类型时,fetch 会遵守该内容类型并且不会触及任何内容,同时仍然按照它想要的方式进行:-/ 所以您不应该指定它,fetch 会知道本身,因为您正在使用 formData()
不要使用此 header:'Content-Type': 'multipart/form-data'
。
删除 header 它应该可以工作。
解释:
将 fetch
与 'Content-Type' 一起使用时:'multipart/form-data' 您还必须设置 boundary
(请求中发送的字段之间的分隔符) .
没有边界,接收请求的服务器将不知道字段从哪里开始和结束。
您可以自己设置边界,但最好让浏览器通过完全删除 'Content-Type'
header 自动设置。