将Uint8array保存到sqlite文件

时间:2014-07-25 23:41:28

标签: javascript save

我使用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”的文件,但我从数据库客户端软件中收到“文件格式无效”错误。

1 个答案:

答案 0 :(得分:2)

  1. 当您拥有二进制数据且其他 MIME 更适合
  2. 时,类型应为 MIME application/octet-stream >
  3. 调用JSON.stringify没有任何意义,如果您已经拥有要保存的二进制数据,那么最终会得到一个类似'{"0":254, "1":128, ...}' String
  4. 结合这两点,返回的函数看起来应该更像

        // ...
            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文件?