2010-11-30 52 views
18

我想知道是否有任何方法可以寫入來自HTML5/JS的文件?在大巴...我可以使用HTML5/JS編寫文件嗎?

+1

寫文件在本地或遠程維護? – WaiLam 2010-11-30 02:18:00

+0

@WaiLam,本地。我猜如果我想遠程,PHP/ASP可以很容易地做到這一點(取決於服務器配置)? – 2010-11-30 14:54:42

回答

0

據我所知,你不能寫入到從HTML5文件,因爲給用戶的文件,網頁訪問將成爲安全風險。

如果您只需要存儲一些數據以便您的頁面稍後可以訪問它,那麼HTML5確實有一些稱爲Web Storage的功能,可以實現這一點。

或者您可以將數據存儲在Cookie(如果它非常小)或服務器上。

24

假設你的最終目標是讓用戶保存您的文件可以找到它的位置,就像右鍵單擊鏈接並選擇「另存爲...」時那樣,這些API的瀏覽器覆蓋範圍並不廣泛,這可能是出於安全考慮。

然而,您可以做什麼 - 不管是否使用API​​,都可以通過指向data: uri的屬性指定您的建議文件名進行cheesing。例如:

<a id="save" download="earth.txt" href="data:text/plain,mostly harmless&#10;">Save</a> 

點擊時,至少在Chrome中,這將保存包含文本mostly harmlessearth.txt文件(和換行符)在你的下載目錄。要設置從JavaScript文件的內容,而不是先調用這個函數:

function setSaveFile(contents, file_name, mime_type) { 
    var a = document.getElementById('save'); 
    mime_type = mime_type || 'application/octet-stream'; // text/html, image/png, et c 
    if (file_name) a.setAttribute('download', file_name); 
    a.href = 'data:'+ mime_type +';base64,'+ btoa(contents || ''); 
} 
1

另一種可能性是考慮建立類似在Windows平臺上一個ClickOnce應用程序。這將提供一個可下載的可執行文件的鏈接,該可執行文件將在用戶的操作系統中運行,但可以使基於Web的回調能夠發送和檢索數據。 ClickOnce應用程序可以嵌入瀏覽器控件,因此您將擁有一個兼容Web的應用程序,可以直接與用戶的存儲進行對話。

0

的這個問題的答案取決於你的回答以下問題:

  • 你罰款,對這種能力支持的事實目前只存在於基於鉻的瀏覽器(Chrome的&歌劇)?
  • 您是否利用現在的專有API來利用這種優勢?
  • 你可以在將來刪除該API的可能性嗎?
  • 在磁盤上用這個API創建的文件縮小到沙箱(文件不能產生任何效果的位置),你還好嗎?

如果你回答「是」以上所有的,那麼,與FileWriterFileSystem API,您可以使用JavaScript在瀏覽器標籤/窗口的上下文寫入文件。

這裏的API是如何串聯使用做一個簡單的例子:

function onQuotaRequestSuccess(grantedQuota) 
{ 

    function saveFile(directoryEntry) 
    { 

     function createFileWriter(fileEntry) 
     { 

      function write(fileWriter) 
      { 
       var dataBlob = new Blob(["Hello world!"], {type: "text/plain"}); 
       fileWriter.write(dataBlob);    
      } 

      fileEntry.createWriter(write); 
     } 

     directoryEntry.getFile(
      "testFile", 
      {create: true, exclusive: true}, 
      createFileWriter 
     ); 
    } 

    requestFileSystem(Window.PERSISTENT, grantedQuota, saveFile); 
} 

var desiredQuota = 1024 * 1024 * 1024; 
var quotaManagementObj = navigator.webkitPersistentStorage; 
quotaManagementObj.requestQuota(desiredQuota, onQuotaRequestSuccess); 

隨着BakedGoods *,即建立一個統一的接口,可用於開展公共存儲操作的Javascript庫所有本地(包括文件系統),以及一些非本地的倉儲設施,上面用此來完成:

bakedGoods.set({ 
    data: [{key: "testFile", value: "Hello world!", type: "text/plain"}], 
    storageTypes: ["fileSystem"], 
    options: {fileSystem:{storageType: Window.PERSISTENT}}, 
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){} 
}); 

文件系統規範定義的目錄結構是如何出現在磁盤上沒有任何指引。例如,在基於Chromium的瀏覽器中,沙盒具有一個虛擬文件系統(目錄結構不一定以與從瀏覽器內訪問時相同的形式存在於磁盤上),其中創建的目錄和文件與API放置。

因此,儘管您可以使用API​​將文件寫入系統,但是在沒有API的情況下(沒有FileSystem API)定位文件可能是一件不平凡的事情。

* BakedGoods是不是別人這傢伙就在這裏:)

相關問題