如何在Chrome / IE Edge中使用xhr.overrideMimeType?

时间:2016-12-02 14:30:08

标签: google-chrome xmlhttprequest

我遇到发送文件的问题(表单数据格式的请求的一部分)。

这个问题似乎来自 Chrome Linux Linux 文件中的 <(这是CVS文件,扩展名为.csv和基本上只是文本)与mimetype一起发送(请求正文中的内容类型)内容类型:application / octet-stream

所以,我正在尝试覆盖 mimetype以匹配 Linux Chrome 发送的相同内容 text / 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)实际打印“text-csv”,但仅限于 Chrome for Linux(特别是Debian)。在其他情况下(任何其他浏览器或平台)没有打印
  • 鉴于上一点,由于某些原因,我似乎很清楚任何其他浏览器/平台无法识别文件类型,因此该文件将作为 octet-stream (通用二进制文件)

1 个答案:

答案 0 :(得分:1)

xhr.overrideMimeType更改了响应的MIME类型,而不是请求。

我想更改文件的MIME类型,只需创建一个具有明确文件类型的新Blob

   DebitCard d;   // balance is set to 100   

   d.makePayment(91.50);
   cout << std::setprecision(3) << d.getBalance() << endl;    // 7.58

   d.chargeCard(200);
   cout << std::setprecision(3) << d.getBalance() << endl;  // 208

   d.makePayment(91.50);
   cout << std::setprecision(3) << d.getBalance() << endl;    // 115

以上内容根据需要将上传表单中文件的MIME类型更改为“text / csv”。

PS。如果您真的想要更改整个请求的MIME类型(而不仅仅是文件),请使用var blob = new Blob([blob], {type: 'text/csv'}); form.append('file', blob, file.name); 。 (只有在xhr.setRequestHeader('Content-Type', 'custom MIME type here');方法中发送非标准或自定义数据时才有意义。)