fetch-отсутствующая граница в multipart / form-data POST
спасибо, что зашли.
я хочу послать new FormData()
как body
of a POST
запрос с использованием fetch api
операция выглядит примерно так
var formData = new FormData()
formData.append('myfile', file, 'someFileName.csv')
fetch('https://api.myapp.com',
{
method: 'POST',
headers: {
"Content-Type": "multipart/form-data"
},
body: formData
}
)
проблема здесь в том, что граница, что-то вроде
boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu
никогда не попадает в Content-Type:
заголовок
это должно выглядеть это
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu
при попытке" той же " операции с new XMLHttpRequest()
вот так
var request = new XMLHttpRequest()
request.open("POST", "https://api.mything.com")
request.withCredentials = true
request.send(formData)
заголовки правильно установлены
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryyEmKNDsBKjB7QEqu
Итак, мой вопрос:
как сделать
fetch
ведите себя точно так же, какXMLHttpRequest
в этой ситуации?если это невозможно, почему?
спасибо всем! Это сообщество является более или менее причиной моего профессионального успеха.
4 ответов
решение проблемы состоит в том, чтобы явно установить Content-Type
до undefined
чтобы ваш браузер или любой клиент, который вы используете, мог установить его и добавить это граничное значение для вас. Разочаровывает, но это правда.
Я использую aurelia-api (обертка для aurelia-fetch-client). В этом случае тип контента по умолчанию- "application/json". Так Что Я Установите тип контента в undefined и это сработало как заклинание.
fetch(url,options)
- если вы задаете строку
options.body
, вы должны установитьContent-Type
в заголовке запроса ,или это будетtext/plain
по умолчанию. -
если параметры.тело-это конкретный объект, такой как
let a = new FormData()
илиlet b = new URLSearchParams()
, вам не нужно устанавливатьContent-Type
вручную.Он будет добавлен автоматически.- на
a
,это будет что-то вроде
multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW
как вы видите, граница автоматически добавлен.
- на
b
, этоapplication/x-www-form-urlencoded;
- на
добавить headers:{content-type: undefined}
браузер создаст для вас границу
то есть для загрузки файла часть и часть с потокового
если вы добавляете "несколько / form-data", это означает, что вы должны создать потоковую передачу и загрузить файл часть и часть
поэтому можно добавить запрос.headers = {content-type: undefined}