2016-12-02 3 views
0

У меня проблема с отправкой файла (часть запроса в формате данных формы).Как использовать xhr.overrideMimeType в Chrome/IE Edge?

Вопрос, кажется, исходя из того факта, что только в Chrome для Linux файл (который является CVS файл с расширением .csv и в основном только текст) отправляется с MimeType (Content-Type в запросе тела) Content-Type: применение/октет-поток

Итак, я пытаюсь переопределить MIMETYPE, чтобы соответствовать тем же посланный Chrome на Linux, который текст/csv.

Однако MimeType, по-видимому, не перекрываться и до сих пор, как отправить октета-поток.

Мой код:

let xhr = new XMLHttpRequest(); 
let form = new FormData(); 

form.append('file', file, file.name); // the file is loaded correctly 
form.append('payload', JSON.stringify(data)); // data is just a JSON object 

xhr.onreadystatechange = function() { 
    if (xhr.readyState === XMLHttpRequest.DONE) { 
     // we arrive here both on Debian and Windows 10 
    } 
} 
xhr.upload.onerror = function() { .... } // no error 

xhr.open('POST', 'http://<my_url>', true); 

console.log(file.type); 
xhr.overrideMimeType("text/csv"); 

xhr.send(form); 

Несколько примечаний:

  • console.log (file.type) фактически печатает "текст-CSV", но только в Chrome для Linux (Debian). в других случаях (любой другой браузер или платформа) ничего не напечатанных
  • учитывая предыдущий пункт, то мне кажется ясным по какой-либо причине любой другой браузер/платформа не может распознать тип файла, поэтому файл посылается как октетов-поток (общий двоичный файл)

ответ

1

xhr.overrideMimeType изменяет MIME-тип ответа , а не запроса.

Я вы хотите изменить MIME-тип файла, просто создать новый Blob с явным типом файла:

var blob = new Blob([blob], {type: 'text/csv'}); 
form.append('file', blob, file.name); 

выше изменяет MIME-тип файла в загруженном виде в «text/csv», по желанию.

PS. Если вы буквально хотите изменить MIME-тип запроса всего (вместо файла), используйте xhr.setRequestHeader('Content-Type', 'custom MIME type here');. (Это имеет смысл, если вы отправляете нестандартные или пользовательские данные в методе xhr.send).

+0

спасибо Роб. так что в основном, я беру переменную «файл» (которая является блобом), я использую ее для создания нового блоба с другим типом? – dragonmnl

+0

неважно, это сработало! , но можете ли вы пояснить, почему на самом деле нужно использовать overrideMimeType? – dragonmnl

+0

@ dragonmnl, например. 'xhr.responseXML' устанавливается только в том случае, если ответ представляет собой XML-документ. Если вы ожидаете ответа XML, но сервер неправильно настроил MIME-тип ответа, вы можете переопределить MIME-тип, чтобы убедиться, что браузер пытается проанализировать ответ как XML, используя 'xhr.overrideMimeType ('приложение/XML') ' –