有没有办法确定blob URL是否指向某个东西?

时间:2014-02-06 15:17:51

标签: javascript ajax internet-explorer google-chrome blob

目前正在开发一个项目,我们通过AJAX获得一堆图像。 我们做了很多这些,似乎IE11似乎失去了很多。

我们获取图片,调用“URL.createObjectURL”,获取有效的URL,但是在下一行,图像消失了。这在其他浏览器中运行良好,我假设我们在IE中遇到了一些限制。

是否有更好的方法来检测此URL是否有效而不是尝试加载它?

似乎有点多余:

  • AJAX文件。
  • 在用户的comp上获取其地址。
  • AJAX,以确保它在那里。

代码:

var urlObj = window.URL || window.webkitURL;
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (this.readyState == 4) {
        active--;
        if (this.status == 200) {
            var blobUrl = urlObj.createObjectURL(new Blob([this.response], {type : 'image/jpeg'}));
            image.setSource(blobUrl); 
        }
    }
}
xhr.open('GET', url);
xhr.responseType = 'arraybuffer';
xhr.send();

因此,如果你称之为A LOT(具有不同的URL) - 我们传递给setSource的blobUrl是一个看似合理的对象URL,但是当你尝试使用它时,就会出现错误。 IE已清理内存,或丢失图像或其他东西。请记住,我们不会更改页面,丢失会话或撤消blobUrl。

我能想到检查这是否已经发生的唯一方法(即blobURL不再指向任何东西),是在blobURL上发出另一个AJAX请求,然后检查它返回200等等.... 有没有更好的办法?我想象的不是。

我已经从一个更大的块中“雕刻”了这个代码块,所以如果有任何明显的错误,那就是原因。它的工作时间约为95%。如果我之后触发AJAX“检查”,并在修复问题的失败时再次加载图像。

奇怪的IE行为。其他人看过这个吗?

更多信息:我们没有使用pdf.js,但此处报告了同样的问题:https://connect.microsoft.com/IE/feedback/details/813485/resource-blob-not-found-when-using-url-createobjecturl-blob

1 个答案:

答案 0 :(得分:0)

这是(或多或少)我们正在使用的支票:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function(){
    if (this.readyState == 4){
        if (this.status == 200 || (this.response && this.response.type && this.response.type == "image/jpeg")) {
            success(blobUrl);
        }
        else {
            fail(blobUrl);
        }
    }
}
xhr.open('GET', blobUrl);
xhr.responseType = 'blob';
xhr.send();

必须使用那种奇怪的response.type检查,因为Firefox返回状态== 0。