最近在使用javascript編寫一些程序時,發現在某些情況下需要將生成的數據保存為本地文件。通過了解,發現javascript可以通過File API來實現這一功能,下面將詳細介紹如何使用javascript來寫本地文件。
首先,我們需要創建一個Blob對象來保存要寫入文件的數據。Blob表示為二進制大型對象(Binary Large OBjects),是一種可以保存二進制數據的方式,我們可以使用Blob對象來存儲我們生成的數據。代碼如下:
var blob = new Blob(['這是我們要寫入到文件中的內容'], {type: 'text/plain'});
該代碼會創建一個包含了所需數據的Blob對象。最后一個參數可以確定所存儲內容的類型,這里我們使用的是簡單的文本類型。此外,File API還提供了其他類型的存儲方式,包括audio、video、image等等。一旦我們生成了Blob對象,使用File API就可以將其保存為文件。我們可以使用下面這段代碼:
var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = 'test.txt'; document.body.appendChild(a); a.click();
此代碼會創建一個鏈接并將Blob對象傳遞給它,然后將這個鏈接下載到本地磁盤上。其中,URL.createObjectURL()函數創建了一個URL,表示我們要下載的文件。我們使用document.createElement()來創建一個a元素來承載下載鏈接。使用a.download屬性可以指定下載鏈接的文件名,這里我們將文件命名為test.txt。最后,通過document.body.appendChild(a)將a元素添加到文檔中,并調用a.click()函數來激活下載鏈接。這時,用戶可以選擇保存文件到本地磁盤。
然而,上述代碼存在一些問題。對于IE瀏覽器,不支持使用Blob構造函數,而是需要使用ActiveXObject,如下所示:
var blob; if(window.navigator.msSaveBlob){ blob = new ActiveXObject("Scripting.FileSystemObject"); var f=fileSystemObj.CreateTextFile("test.txt", true); f.WriteLine('這是我們要寫入到文件中的內容'); f.Close(); }
而對于Chrome瀏覽器,如果想讓下載鏈接直接下載而不是在瀏覽器里打開,需要加上一個"download"屬性。 這是我們在第二段代碼中所做的,但是當前版本的Firefox瀏覽器不會自動識別該屬性。為了兼容所有瀏覽器,我們還需要添加一個window.URL.revokeObjectURL()函數,以釋放URL對象,代碼如下:
var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; if(a.download !== undefined){ a.download = 'test.txt'; } document.body.appendChild(a); a.click(); w.URL.revokeObjectURL(url);
這段代碼中,我們檢查了a.download屬性是否存在。如果存在,我們就將其設置為文件名;如果不存在,則說明瀏覽器不支持該屬性,并執行默認行為。最后,我們調用window.URL.revokeObjectURL()函數以釋放URL對象并增加性能。
綜上所述,使用File API可以很方便地在javascript中寫入本地文件。我們可以使用Blob對象存儲數據,然后將其下載到本地磁盤上。雖然代碼中存在一些兼容性問題,但只要了解瀏覽器的不同支持行為,我們仍然可以實現跨瀏覽器的一致性行為。