2014-07-25 115 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