【问题标题】:Chrome 65 change to download blob automatically in Chrome appChrome 65 更改为在 Chrome 应用中自动下载 blob
【发布时间】:2018-09-01 08:56:25
【问题描述】:

我有一个用 JavaScript 编写的 Google Chrome 应用程序(Windows 和 Mac),带有一个用于自动下载日志文件的菜单项。在 Chrome 65 之前,我一直成功使用 https://github.com/eligrey/FileSaver.js,没有任何问题。现在,当用户单击菜单项时,我收到以下控制台错误:

Can't open same-window link to "blob:chrome-extension://lcgcc...1904"; try target="_blank"

所以我尝试添加 target="_blank",现在当我点击菜单项时,我得到一个 对话框

There is no application set to open the URL blob:chrome-extension://lcgc...6b11.
Search the App Store for an application that can open this document,
or choose an existing application on your computer.

单击对话框上的“取消”会使其消失,但当然不会下载文件。

这是另一个问题(不是我的)的简单 jsfiddle,它具有类似的代码: http://jsfiddle.net/koldev/cW7W5/

var saveData = (function () {
    var a = document.createElement("a");
    document.body.appendChild(a);
    a.style = "display: none";
    return function (data, fileName) {
        var json = JSON.stringify(data),
            blob = new Blob([json], {type: "octet/stream"}),
            url = window.URL.createObjectURL(blob);
        a.href = url;
        a.download = fileName;
        a.click();
        window.URL.revokeObjectURL(url);
    };
}());

var data = { x: 42, s: "hello, world", d: new Date() },
    fileName = "my-download.json";

saveData(data, fileName);

我在我的应用程序中尝试了这个示例代码,它显示了相同的行为:没有 target="_blank" 的错误消息和带有 target="_blank" 的对话框。

请注意,此代码在 Chrome 浏览器中可以正常工作 - 它会自动下载 blob 文件。这只是 Google Chrome 应用程序中的一个问题,而且只是在我升级到 Chrome 65 之后。

知道谷歌浏览器应用程序“很快”就会消失,但与此同时,在我找到重写整个应用程序的人之前,我真的需要一个适用于所有用户的解决方案(简称告诉他们不要升级 Chrome……)。

有人知道自动下载不会在 Chrome 应用程序上遇到这些问题的 blob 文件的不同方法吗?它不需要跨浏览器,因为它是一个 Chrome 应用程序。

提前致谢!

【问题讨论】:

    标签: javascript google-chrome download blob


    【解决方案1】:

    遇到了同样的问题,这是我的解决方法和我的笔记。

    Chrome 65 对锚点下载属性进行了更改。这会导致锚点单击执行重定向而不是下载。仅当单击的 URL 是跨域的时才会发生这种情况。显然 blob: 网址开头的协议使其跨域或其他东西。

    因此,要解决此问题,请使用适用于 chrome 应用和扩展程序的 chrome-platform-only API。原来他们添加了一个新的 API,前段时间没有提到它,叫做 chrome.downloads。

    假设您要启动一个 blob 对象。首先,在其清单中为应用添加“下载”权限。这将启用“chrome.downloads”api。

    然后执行以下操作:

    const url = URL.createObjectURL(blob);
    const args = {url: url};
    const callback = function() {};
    chrome.downloads.download(args, callback);
    URL.revokeObjectURL(url);
    

    我可以确认我刚刚在 Mac 上的 Chrome 66 中执行此操作,现在它会根据需要显示另存为对话框。

    我对这个解决方案非常不满意,因为它不是跨平台的,但至少它可以工作。

    API 文档:https://developer.chrome.com/extensions/downloads

    【讨论】:

    • 这看起来棒极了。不幸的是,当我添加“下载”权限并重新加载应用程序时,我收到以下错误:“'下载'只允许用于扩展,但这是一个打包的应用程序。”看起来 Chromium 意识到了原始错误并且可能正在修复它(手指交叉!):bugs.chromium.org/p/chromium/issues/detail?id=821219
    • 看起来 Chromium 团队修复了 Chromium 66 中的原始错误(请参阅上面评论中的链接)。
    猜你喜欢
    • 2020-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多