但受限於瀏覽器,很多情況下我們都只能給個鏈接,讓用戶點擊打開-》另存為。如下面這個連結:
使用者點擊這個連結的時候,瀏覽器會開啟並顯示連結指向的文件內容,顯然,這並沒有實現我們的需求。 HTML5中為a標籤增加了一個download屬性,只要有這個屬性,點擊這個連結時瀏覽器就不在開啟連結指向的文件,而是改為下載(目前只有chrome、firefox和opera支援)。
下載時會直接使用連結的名字來當檔名,但是是可以改的,只要給download加上想要的檔名即可,如:download=「not-a-file.js」。
但是這樣還不夠,以上的方法只適合用在檔案是在伺服器上的情況。如果在瀏覽器端js產生的內容,想讓瀏覽器進行下載要如何辦到呢?
其實還是有辦法辦到的,相信很多人都多少聽過了DataURI這個詞,比較常見的就是圖片的src,如:
那麼,現在要將js產生的內容進行下載就有法可依了。封裝成一個方法如下:
aLink.download = fileName;
aLink.href = "data:text/plain," content;
}
呼叫downloadFile之後,使用者點擊鏈接,就能觸發瀏覽器下載。
但是,還不夠,上面的辦法有兩個硬傷,會導致流失很多懶人美眉:
下載的檔案類型限制死了,美眉要下載處理後的果照怎麼辦?
下載還要再點一下,太麻煩啦。
要解決文件類型的問題,可以用瀏覽器的新API(URL.createObjectURL)來解決問題,URL.createObjectURL通常都是用來創建圖片的DataURI用來顯示圖片,這裡用來下載文件,讓瀏覽器來幫我們設定好文件類型。
URL.createObjectURL的參數是File對像或Blob對象,File對像也就是透過input[type=file]選擇的文件,Blob對像是二進位大對象,詳細說明可參考這裡。
現在,我們只要用content創建一個ObjectURL並賦值給aLink即可解決檔案類型的限制問題。
檔案的自動下載也蠻好辦,自己建置一個UI點擊事件,再自動觸發下,就能實現自動下載啦。
現在來看看最終程式碼:
var blob = new Blob([content]);
var evt = documop. ("click", false, false);//initEvent 不加後兩個參數在FF下會報錯, 感謝Barret Lee 的回饋
aLink.download = fileName;
aLink.href = URL.createObjectUR(🎜> aLink.href = URL.createObjectUR( blob);
aLink.dispatchEvent(evt);
}
註:目前(2014-01)Blob和URL.createObjectURL在標準瀏覽器裡面都不再需要加私有前綴,可以放心使用啦啦啦~~如果你不放心,可以查查Can I Use。