使用downloads.download()API将数据URI保存为文件

Kas*_*Lee 5 javascript download google-chrome-extension data-uri firefox-addon-webextensions

更新

我已经通过使用Blob URL/Object-URL()解决了这个问题(感谢@DanielHerr)URL.createObjectURL(blob),但我仍然很好奇为什么在使用data:URL 时存在此错误


我正在使用WebExtensions API为Chrome和Firefox创建扩展程序.

扩展程序随时间收集数据,我想实现一个功能,将其导出为CSV文件.

我尝试使用downloads.download()下载文件,但是我收到错误:

错误:data:text/csv;charset=utf-8;base64,{data...}为downloads.download 输入参数选项的错误(错误处理URL:错误:URL拒绝访问).

我已经尝试添加"<all_urls>"permissions键中manifest.json,但这没有任何区别.

这是我正在使用的代码:

var csv = 'Hello, World!' // Real data goes here
var url = 'data:text/csv;charset=utf-8;base64,' +
           window.btoa(unescape(encodeURIComponent(csv)))

chrome.downloads.download({'url': url})
Run Code Online (Sandbox Code Playgroud)

我似乎无法解决如何解决这个问题,所以我真的很感激帮助!谢谢!


manifest.json看起来像这样:

{
    "manifest_version": 2,
    "name": "Name",
    "version": "1.0.0",
    "description": "Description",
    "icons": {
        "16": "/icons/icon-16.png",
        "32": "/icons/icon-32.png",
        "48": "/icons/icon-48.png",
        "64": "/icons/icon-64.png",
        "96": "/icons/icon-96.png"
    },
    "applications": {
        "gecko": {
            "id": "@name",
            "strict_min_version": "48.0"
        }
    },
    "background": {
        "scripts": ["/scripts/a.js"]
    },
    "permissions": [
        "storage",
        "tabs",
        "activeTab",
        "downloads",
        "<all_urls>"
    ]
}
Run Code Online (Sandbox Code Playgroud)

a.js 包含要导出为CSV的代码.

我扯下了代码的其余部分下来,只有manifest.json,a.js和图标文件都离开了,但它仍然报同样的错误.

Kas*_*Lee 8

我通过使用Blob URL/Object-URL而不是数据URI解决了这个问题:

var csv = 'foo,bar,baz'
var blob = new Blob([csv], {type: "text/csv;charset=utf-8"})

chrome.downloads.download({
    'url': URL.createObjectURL(blob),
    'filename': 'file.csv',
})
Run Code Online (Sandbox Code Playgroud)

  • 在Firefox中,对诸如`downloads.download`和`tabs.create`之类的API的访问检查比在Chrome中更严格.目前,如果允许扩展名加载URL,则只能下载/打开页面.在Firefox中,数据:-URLs从调用者(即原点)继承主体,并且不受阻止.但是如果您认为访问`data:`-URLs很重要(从技术上讲,Firefox可以使用null主体来解决泄漏权限的问题),您可以创建一个功能请求.这是打开标签的错误:https://bugzil.la/1269456 (4认同)