2014-07-25 67 views
1

我正在使用sql.js作为SQLITE3数据库的管理界面。将Uint8array保存到sqlite文件

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

回答

2
  1. 应该是MIMEapplication/octet-stream当你有二进制数据,没有其他MIME更合意
  2. 调用JSON.stringify是没有意义的,你结束了一个字符串看起来像'{"0":254, "1":128, ...}'当你已经拥有的二进制数据要保存它

结合这两个点,该函数返回应该看起来更像这个

// ... 
     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,但它是直接写入光盘(例如与卷曲或直接链接)将该文件是一个有效的SQL文件?

+0

与MIME类型出色地工作。谢谢! – Blenderer