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

时间:2016-10-26 18:40:29

标签: javascript google-chrome-extension download data-uri firefox-webextensions

更新

我已经解决了这个问题(感谢@DanielHerr)使用Blob网址/对象网址(URL.createObjectURL(blob)),不过我还是很好奇为什么会出现这个错误使用data:网址

时存在

我正在使用适用于Chrome和Firefox的WebExtensions API创建扩展程序。

扩展程序会随着时间的推移收集数据,我希望实现一项功能,将其导出为CSV文件。

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

  

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

我已尝试将"<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})

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

我的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>"
    ]
}

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

我删除了剩下的代码,只留下manifest.jsona.js和图标文件,但仍然报告了相同的错误。

1 个答案:

答案 0 :(得分:6)

我通过使用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',
})