将stringified / encodeURIComponent数据导出到文件时出现扩展名崩溃

时间:2015-04-28 20:54:36

标签: javascript google-chrome-extension stringify encodeuricomponent

关于从选项页面导出扩展数据 我有一些对象,存储的页面截图以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 list[i] list[i].offset()之后无论大小如何,如果我没有将其传递给下载功能,一切正常 有什么我可以做的来修复代码并避免崩溃吗?...或者使用这种方法时是否有任何限制?

1 个答案:

答案 0 :(得分: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();
}