好的,我正在通过xhr下载数据块,我想将其存储在本地以用于chrome扩展。
起初我能够将它存储在localStorage
中,但后来我需要继续使用localStorage无法处理的更大的块。所以我决定将它存储在Web Sql Database中。但是,我能够将数据完全按照下载的方式存储在localStorage
中,但是当我尝试将数据存储在数据库中时,数据会丢失或者出现错误。
像这样:
//this way the data gets lost because it is filtered to prevent SQL injection attacks
tx.executeSql('INSERT INTO files (id, content) VALUES (?,?)', [fileID,file]);
//this method gives an error (unrecognized token) because the data contains byte values in the string
tx.executeSql('INSERT INTO files (id, content) VALUES (?, "' + file + '")', [id]);
我能想到将数据导入数据库的另一种方法是使用btoa(file)
,它可以工作,但我认为如果必须执行{{},性能将受到相当大的影响{每次存储/使用数据时都会{1}} / btoa
。
那么我的问题是,如何在不使用atob
的情况下将数据存储在数据库中,或者如果不可能btoa
使用多少性能?
我也非常确定btoa
使用SQLite以及Web Sql数据库,为什么我不能像localStorage
那样轻松地将数据放在后者中?
答案 0 :(得分:0)
看看这样的东西,你需要对二进制数据进行base64编码,因为它需要是可打印的字符。
http://www.webtoolkit.info/javascript-base64.html
虽然这会导致二进制数据大小增加四倍。
您需要将其编码为十六进制我相信,也许,使用SQLite表示二进制数据
tx.executeSql('INSERT INTO files (id, content) VALUES (2, "0xBADF00D12840F32");');
例如,后一种SQLite方法可能更有效。