Javascript 使用xhr.overrideMimeType但首先获取服务器响应?

Javascript 使用xhr.overrideMimeType但首先获取服务器响应?,javascript,xmlhttprequest,Javascript,Xmlhttprequest,我想从服务器获取Base64编码的文件,以便在dataURL中使用它,因此我使用: xhr.overrideMimeType("text/plain; charset=x-user-defined"); 因此,我得到了未处理的数据来执行base64编码 但我还想获取最初从服务器返回的mimetype,以声明我的dataURL: var-dataUrl='data:'+mimetype+';base64'+b64 当我尝试以下方法时: var xhr = new XMLHttpRequest()

我想从服务器获取Base64编码的文件,以便在dataURL中使用它,因此我使用:

xhr.overrideMimeType("text/plain; charset=x-user-defined");
因此,我得到了未处理的数据来执行base64编码

但我还想获取最初从服务器返回的mimetype,以声明我的dataURL:
var-dataUrl='data:'+mimetype+';base64'+b64

当我尝试以下方法时:

var xhr = new XMLHttpRequest();
xhr.open("GET", url, false);
var mimetype = xhr.getResponseHeader('content-type');
xhr.overrideMimeType("text/plain; charset=x-user-defined");
xhr.send(null);
返回的内容类型始终为空

完整资料来源:

function getFileDataUrl(link,mimetype)
{
  var url = location.origin+link;
  var getBinary = function (url) 
  {
    var xhr = new XMLHttpRequest();
    xhr.open("GET", url, false);
    if(mimetype == null)
    {
        mimetype = xhr.getResponseHeader('content-type');
        console.log('mimetype='+mimetype);
    }
    xhr.overrideMimeType("text/plain; charset=x-user-defined");
    xhr.send(null);
    return xhr.responseText;
   };
   var bin = getBinary(url);
   var b64 = base64Encode(bin);
   var dataUrl = 'data:'+mimetype+';base64,'+b64;
   return dataUrl;
}
var dataUrl = getFileDataUrl(link,null);

您可以将
XMLHttpRequest
responseType
设置为
“blob”
“arraybuffer”
,然后在
response
上使用
FileReader
FileReader.prototype.readAsDataURL()
。注意,
FileReader
onload
事件异步返回结果。要同步读取文件,可以使用
Worker
FileReaderSync()


至少不推荐使用
XMLHttpRequest()
,请参阅

您可以在主线程中使用
Promise
,使用
Worker
或在调度
FileReader
load
事件时获取请求资源的
数据URI
。或者在
Worker
线程中使用同步
XMLHttpRequest()
FileReaderSync()
,然后在主线程中侦听
消息
事件,使用
然后()
获取
承诺

主线

var worker = new Worker("worker.js");
var url = "path/to/resource";

function getFileDataUrl(url) {
  return new Promise(function(resolve, reject) {        
    worker.addEventListener("message", function(e) {
      resolve(e.data)
    });
    worker.postMessage(url);
  })
}

getFileDataUrl(url)
.then(function(data) {
  console.log(data)
}, function(err) {
  console.log(err)
});
worker.js

var reader = new FileReaderSync();
var request = new XMLHttpRequest();

self.addEventListener("message", function(e) {
  var reader = new FileReaderSync();
  request.open("GET", e.data, false);
  request.responseType = "blob";
  request.send(null);
  self.postMessage(reader.readAsDataURL(request.response));
});

plnkr

由于某些原因,在同步使用XMLHttpRequest时,我无法设置responseType。您有使用Woker和FileReaderSync()的示例吗?@subject42为什么需要同步使用
XMLHttpRequest
?我需要同步使用它,因为进一步的执行取决于它的结果,在文件加载过程中也应该避免进一步的用户交互。
var reader = new FileReaderSync();
var request = new XMLHttpRequest();

self.addEventListener("message", function(e) {
  var reader = new FileReaderSync();
  request.open("GET", e.data, false);
  request.responseType = "blob";
  request.send(null);
  self.postMessage(reader.readAsDataURL(request.response));
});