从 Blob URL 创建下载链接

11
在我正在开发的 Google Chrome 扩展程序中,通过 XMLHttpRequest 从服务器下载了一个文件。该文件包含一些二进制数据,这些数据存储在一个 ArrayBuffer 对象中。为了提供下载此文件的可能性,我使用了 createObjectURL API。
function publish(data) {
  if (!window.BlobBuilder && window.WebKitBlobBuilder) {
    window.BlobBuilder = window.WebKitBlobBuilder;
  }
  var builder = new BlobBuilder();
  builder.append(data);
  var blob = builder.getBlob();
  var url = window.webkitURL.createObjectURL(blob);
  $("#output").append($("<a/>").attr({href: url}).append("Download"));

它能正常工作,但文件名是一个类似于不透明UUID的字符串 9a8f6a0f-dd0c-4715-85dc-7379db9ce142。有没有办法将这个文件名强制更改为更加用户友好的名称?


3
BlobBuilder已过时,请使用Blob构造函数。 - markasoftware
2个回答

12

7

我以前从未尝试过,但是应该可以创建一个新的文件对象(允许您指定文件名),并将您的 Blob 写入其中。大致如下:

function publish(data, filename) {

    if (!window.BlobBuilder && window.WebKitBlobBuilder) {
        window.BlobBuilder = window.WebKitBlobBuilder;
    }

    fs.root.getFile(filename, {
        create: true
    }, function (fileEntry) {

        // Create a FileWriter object for our FileEntry (log.txt).
        fileEntry.createWriter(function (fileWriter) {

            fileWriter.onwriteend = function (e) {
                console.log('Write completed.');
            };

            fileWriter.onerror = function (e) {
                console.log('Write failed: ' + e.toString());
            };

            var builder = new BlobBuilder();
            builder.append(data);
            var blob = builder.getBlob();
            fileWriter.write(blob);

        }, errorHandler);

    }, errorHandler);
}

我认为这对你可能有用。


4
谢谢您,我们的解决方案有效了。其实我已经查看过这个API,但是FileEntry接口中的toURL()方法似乎无效。经过一些Google搜索,我发现在Chrome上这个方法已经被重命名为toURI()。 - Jcs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接