Когда HTML-форма содержит <input type="file">, мне нужно указать атрибут enctype="multipart/form-data" в форме. Однако, когда я отправляю двоичный файл через XMLHttpRequest, мне не нужно нигде указывать этот тип:

var builder = new BlobBuilder();
builder.append("Hello world!");
var blob = builder.getBlob("text/plain");

var oReq = new XMLHttpRequest();
oReq.open("POST", url, true);
oReq.send(blob);

Почему так?

2
Max Koretskyi 22 Авг 2014 в 12:56
1
BlobBuilder не рекомендуется использовать в течение некоторого времени, используйте вместо него var blob = new Blob(['Hello world!'], {type: 'text/plain'});.
 – 
Rob W
22 Авг 2014 в 13:12

1 ответ

Лучший ответ

С помощью формы вы сообщаете браузеру, как отформатировать данные для отправки на сервер. (Значение по умолчанию для enctype не поддерживает файлы).

С XHR вы сами форматируете данные. (Тем не менее, вам следует по-прежнему использовать addHeader для указания подходящего типа содержимого для вашего тела POST).

3
Quentin 22 Авг 2014 в 12:58
Спасибо. Когда вы говорите как отформатировать данные - что вы имеете в виду? Вы можете дать ссылку на объяснение этого? Итак, с XHR я бы сделал это таким образом - oReq.setRequestHeader("content-type", "application/zip") - если я передаю заархивированный архив, правильно?
 – 
Max Koretskyi
22 Авг 2014 в 13:07
1
Если вы отправляете zip-файл и не упаковываете его в какой-либо другой формат данных, тогда да, это тот тип содержимого, который вам следует использовать.
 – 
Quentin
22 Авг 2014 в 13:36
Я только что нашел здесь хороший объяснение того, как кодирование влияет на представление данных в теле запроса. Правильно ли я предполагаю, что если я помещу контент, подобный этому oReq.send("text here"), он будет выглядеть в теле запроса, как если бы использовалось шифрование text/plain?
 – 
Max Koretskyi
22 Авг 2014 в 15:00
Он будет закодирован как text / plain, но не как enctype text / plain, который будет использоваться при отправке HTML-формы (что бесполезно для любых реальных целей), и он вообще не будет зашифрован.
 – 
Quentin
22 Авг 2014 в 15:09