Javascript 使用xhr.overrideMimeType但首先获取服务器响应?
我想从服务器获取Base64编码的文件,以便在dataURL中使用它,因此我使用: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()
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));
});