2016-09-01 11 views
17

спасибо, что остановились.fetch - Отсутствует граница в multipart/form-data POST

Я хочу послать new FormData() как body в виде 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

поэтому мой вопрос,

  1. как сделать fetch ведут себя так же, как XMLHttpRequest в этой ситуации?

  2. если это невозможно, почему?

Спасибо всем! Это сообщество является более или менее причиной того, что у меня есть профессиональный успех.

+0

Похоже, что это было бы ошибкой со стороны браузера ... Вы пробовали другие браузеры? – jakerella

+0

@ jakerella для записи, это делалось в chrome версии 52.0.2743.116 (64-bit) – James

ответ

32

Решение проблемы заключается в том, чтобы явно установить Content-Type на номер undefined, чтобы ваш браузер или любой другой клиент, который вы используете, мог установить его и добавить к нему это граничное значение. Разочарование, но правда.

+4

с использованием fetch, я удалил заголовок Content-Type, и он сработал. – sww314

+4

Невероятно !! Я провел часы, пока не нашел это! 'delete result.headers ['Content-Type'];' работал для меня, спасибо! – Crysfel

+0

@ Crysfel Спасибо .. удаленный тип контента работал для меня: P – myDoggyWritesCode

2

Я использую aurelia-api (обертка для aurelia-fetch-client). В этом случае по умолчанию для Content-Type используется «application/json». Итак, я установил Content-Type в undefined, и он работал как шарм.

1
fetch(url,options) 
  1. Если вы установите строку как options.body, вы должны установить Content-Type в заголовке запроса, или это будет text/plain по умолчанию.
  2. Если options.body является конкретным объектом, например let a = new FormData() или let b = new URLSearchParams(), вам не нужно устанавливать Content-Type вручную. Он будет добавлен автоматически.

    • для a, это будет что-то вроде

    multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW

    , как вы видите, граница Automaticlly добавляется.

    • для b, это application/x-www-form-urlencoded;
+0

Очень хорошо, что вы сказали нам, что «граница» добавляется автоматически. Мы все это знали раньше. – Green