javascript - Chrome 65 更改为在 Chrome 应用中自动下载 blob

标签 javascript google-chrome download blob

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

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 之后才出现的。

知道 Google Chrome 应用程序“很快”就会消失,但与此同时,在我找到人重写整个应用程序之前,我确实需要为所有用户提供一个解决方案(简称告诉他们不要升级 Chrome...)。

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

提前致谢!

最佳答案

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

Chrome 65 进行了更改,其中忽略了 anchor 下载属性。这会导致 anchor 点击进行重定向而不是下载。只有当点击的 URL 是跨域时才会发生这种情况。显然 blob: url 开头的协议(protocol)使其成为跨源或其他东西。

因此,要绕过它,请使用 chrome 应用程序和扩展程序可用的仅限 chrome 平台的 API。原来他们添加了一个新的 API,前一段时间没有提到它,叫做 chrome.downloads。

假设您有一个要开始的 blob 对象。首先,在其 list 中向应用程序添加“下载”权限。这将启用“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

关于javascript - Chrome 65 更改为在 Chrome 应用中自动下载 blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49436819/

相关文章:

python - python selenium chrome headless中的文件下载路径设置不适用

Python:用于下载有效 .zip 文件的跨平台代码

android - 如何从 url 下载文件/图像到你的 android 应用程序

javascript - 将图像从 localStorage 上传到 PHP

javascript - 我可以将 "new"匿名函数传递给 addEventListener

javascript - 什么会导致浏览器 (Chrome) 生成下载

javascript - Chrome扩展回调函数和并发

javascript - Bootstrap 标签 : how to retrieve items from the input list to server side?

javascript - 将扫描条形码的类型或数据写入 REACT-NATIVE 上的文本输入中

javascript - Chrome 或 Bootstrap 4.0.0-alpha.5 错误?