我使用sql.js作为SQLITE3数据库的管理界面。
基本上,sql.js提供了一个导出方法,该方法返回 Uint8Array ,供开发人员进一步处理。
目标:让用户按一个按钮,弹出“另存为”对话框以保存一个有效的sqlite3数据库文件。
我尝试过的内容:这个保存代码块我在网络的各个部分都发现了这个问题。
/* Uint8Array */
var binArray = db.export();
var saveData = (function () {
var a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
return function (data, fileName) {
/* Is JSON.stringify necessary? */
var json = JSON.stringify(data),
/* Is type: "octet/stream" correct? */
blob = new Blob([json], {type: "octet/stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
}());
saveData(binArray, "sqldb.sql");
它正确保存了一个名为“sqldb.sql”的文件,但我从数据库客户端软件中收到“文件格式无效”错误。
答案 0 :(得分:2)
application/octet-stream
>
JSON.stringify
没有任何意义,如果您已经拥有要保存的二进制数据,那么最终会得到一个类似'{"0":254, "1":128, ...}'
的 String 结合这两点,返回的函数看起来应该更像
// ...
return function (data, fileName) {
var blob = new Blob([data], {type: "application/octet-stream"}),
url = window.URL.createObjectURL(blob);
a.href = url;
a.download = fileName;
a.click();
window.URL.revokeObjectURL(url);
};
你可能还需要考虑 Uint8Array 是否真的是一个完整的.sql
文件,即如果你做了调用而不是在浏览器/ ajax中,但是它直接写入光盘(例如使用curl或直接链接)该文件是否是一个有效的sql文件?