【问题标题】:File API not working with Blob in Google Chrome Extension文件 API 不适用于 Google Chrome 扩展程序中的 Blob
【发布时间】:2012-05-02 11:20:24
【问题描述】:

我正在为 Google Chrome 编写一个扩展程序,我需要在其中下载页面图像并将它们保存在磁盘上的临时文件中。为此,我创建了一个 XMLHttpRequest 并使用它来下载图像。在回调函数中,当我在 request.response 中有图像时,我使用 window.webkitRequestFileSystem(window.TEMPORARY, 1024 * 1024 * 20, writeImageToFile, errorHandler) 从 Windows 请求一个临时文件。在回调函数 writeImageToFile 中,我创建了 FileWriter 对象并将 blob 写入其中。该文件正在创建,但我无法找到它的创建位置。我需要扩展文件的 Windows 路径。请帮忙!

【问题讨论】:

    标签: javascript html google-chrome google-chrome-extension google-chrome-os


    【解决方案1】:

    出于您的目的,您不需要虚拟文件系统。使用 webkitURL.createObjectURL 方法从 blob 创建 URL:

    window.webkitURL.createObjectURL(blob);
    

    从Chrome 19开始,可以直接使用responseType获取Blob对象:

    var xhr = new XMLHttpRequest();
    xhr.responseType = 'blob';
    xhr.onload = function() {
        // xhr.response is a Blob
        var url = webkitURL.createObjectURL(xhr.response);
        console.log('URL: ', url);
    };
    xhr.open('GET', 'http://example.com/favicon.ico');
    xhr.send();
    

    从 Chrome 10 开始,您可以获得ArrayBuffer 响应,并将其转换为 blob (demo):

    var xhr = new XMLHttpRequest();
    xhr.responseType = 'arraybuffer';
    xhr.onload = function() {
        // Create blob from arraybuffer
        var bb = new (window.BlobBuilder || window.WebKitBlobBuilder)();
        bb.append(xhr.response);
        var url = webkitURL.createObjectURL(bb.getBlob());
        console.log('URL: ', url);
    };
    xhr.open('GET', 'http://example.com/favicon.ico');
    xhr.send();
    

    (如果您想对 Firefox 使用相同的代码,请使用 window.URLMozBlobBuilder)。

    【讨论】:

    • 附言。如果您仍想创建文件系统 URI,请参阅 html5rocks.com/en/tutorials/file/filesystem/#toc-filesystemurls
    • 图片的数据需要传递给一个NPAPI DLL。我应该能够在 JavaScript 中获取图像数据(base64)并直接传递给 NPAPI DLL,或者将图像保存在本地文件中,并将该文件的路径传递给 NPAPI。 createObjectURL 创建的 URL 仅对 Chrome 可见,对 NPAPI 不可见。
    • @RahulGulati base64: var base64_string = btoa(xhr.responseText);(使用window.btoa)。
    • 看起来像获取图像数据并内联扩展它不起作用,因为图像的大小可能非常大。有没有办法可以将图像保存在文件中并将文件的路径传递给 NPAPI DLL,NPAPI DLL 应该可以访问该路径?
    • @RahulGulati 1. 可能存在关系(Chrome 不知何故必须在 JS 中显示正确的文件),但我不知道。 2. btoa 工作正常,假设输入是 ASCII。当至少一个字符超出0x00 - 0xff 字符范围时,将引发错误。使用arraybuffer 响应类型,并将其包装在Uint8Array() 中。然后遍历字节,并将其连接起来。最后,在连接的字符串上运行btoa
    猜你喜欢
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多