将 stringified/encodeURIComponent 数据导出到文件时扩展崩溃
extension crash on exporting stringified/encodeURIComponent data to file
这是关于从选项页面导出扩展数据。
我有一组对象,其中存储的页面屏幕截图以 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();
}
单击按钮时,从存储中获取数据,对其进行字符串化,创建假 link,设置属性并单击它。
如果生成的文件 小于 ~1.7 MB,代码可以正常工作,但所有高于此生成选项页面的内容都会崩溃并且扩展名会被禁用。
我可以在 JSON.stringify
之后 console.log(strSt)
并且无论大小,如果我不将它传递给下载功能,一切都可以正常工作..
我能做些什么来修复代码并避免崩溃吗?...或者使用此方法时是否有大小限制?
我按照 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 也有效
(我弄乱了导致崩溃的代码)
这是在本地保存数据的更好方法,因为在浏览器内部下载页面上,数据URL 下载会使页面混乱,如果文件太大(long URL),它会导致浏览器崩溃。它们显示为实际 URLs(这是原始保存的数据),而 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();
}
这是关于从选项页面导出扩展数据。
我有一组对象,其中存储的页面屏幕截图以 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();
}
单击按钮时,从存储中获取数据,对其进行字符串化,创建假 link,设置属性并单击它。
如果生成的文件 小于 ~1.7 MB,代码可以正常工作,但所有高于此生成选项页面的内容都会崩溃并且扩展名会被禁用。
我可以在 JSON.stringify
之后 console.log(strSt)
并且无论大小,如果我不将它传递给下载功能,一切都可以正常工作..
我能做些什么来修复代码并避免崩溃吗?...或者使用此方法时是否有大小限制?
我按照 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 也有效
(我弄乱了导致崩溃的代码)
这是在本地保存数据的更好方法,因为在浏览器内部下载页面上,数据URL 下载会使页面混乱,如果文件太大(long URL),它会导致浏览器崩溃。它们显示为实际 URLs(这是原始保存的数据),而 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();
}