2

它是关于从选项页面导出扩展数据。
我有一组对象,其中存储了以 base64 编码的页面截图,以及其他一些次要的 obj 属性。我正在尝试使用以下代码导出它们:

exp.onclick = expData;

function expData() {
    chrome.storage.local.get('extData', function (result) {
        var dataToSave = result.extData;
        var strSt = JSON.stringify(dataToSave);
        downloadFn('extData.txt', strSt);
    }); 
}

function downloadFn(filename, text) {
    var fLink = document.createElement('a');
    fLink .setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    fLink .setAttribute('download', filename);
    fLink .click();

}

单击按钮时,从存储中获取数据,对其进行字符串化,创建假链接,设置属性并单击它。
如果生成的文件低于 ~1.7 MB,则代码可以正常工作,但上面的所有内容都会产生崩溃的选项页面,并且扩展名会被禁用。无论大小如何,我都可以正常工作,如果我不将其传递给下载功能。我
可以 做些什么来修复代码并避免崩溃?...或者大小有什么限制吗?使用这种方法?console.log(strSt)JSON.stringify

4

1 回答 1

1

正如 Xan 建议的那样,我解决了这个问题,切换到chrome.downloads(这是额外的权限,但工作正常)
我所做的只是替换downloadFN函数中的代码,这样更干净

function downloadFn(filename, text) {
    var eucTxt = encodeURIComponent(text);
    chrome.downloads.download({'url': 'data:text/plain;charset=utf-8,'+eucTxt, 'saveAs': false, 'filename': filename});

}

请注意,使用URL.createObjectURL(new Blob([ text ]))也会产生相同的扩展崩溃

编辑: 正如@dandavis 指出的那样(并且 RobW 确认),转换为 Blob 也可以工作
(我的代码混乱导致崩溃)
这是在本地保存数据的更好方法,因为在浏览器内部下载页面上,dataURL 下载可能会使页面和如果文件太大(长 URL),它会使浏览器崩溃。它们显示为实际 URL(这是原始保存的数据),而 blob 下载仅带有 id

function downloadFn(filename, text) {
    var vLink = document.createElement('a'),
    vBlob = new Blob([text], {type: "octet/stream"}),
    vUrl = window.URL.createObjectURL(vBlob);
    vLink.setAttribute('href', vUrl);
    vLink.setAttribute('download', filename);
    vLink.click();
}
于 2015-04-29T09:43:19.130 回答