摘要:出于安全考慮,無法直接調(diào)用寫文件到磁盤,但是卻可以通過下載來變相實(shí)現(xiàn)保存功能。生成文件并下載是一種逗號分隔的表格文件格式,可以很好的被支持,由于其文件格式簡單,所以經(jīng)常用在簡單的表格上面。
出于安全考慮,JS無法直接調(diào)用FileAPI寫文件到磁盤,但是卻可以通過下載來變相實(shí)現(xiàn)保存功能。HTML5的download屬性
JS要實(shí)現(xiàn)下載功能,一般都是這么幾個過程:生成下載的URL,動態(tài)創(chuàng)建一個A標(biāo)簽,并將其href指向生成的URL,然后觸發(fā)A標(biāo)簽的單擊事件,這樣就會彈出下載對話框,從而實(shí)現(xiàn)了一個下載的功能。
這個屬性很重要,它可以指定下載文件名,并且可以告訴瀏覽器目標(biāo)鏈接是一個下載鏈接,不是一個普通鏈接,我們看下面代碼就能看出區(qū)別了:
下載1 下載2
可以發(fā)現(xiàn),下載1按鈕能夠?qū)崿F(xiàn)下載,點(diǎn)擊下載2鏈接時直接在瀏覽器打開文件內(nèi)容了。
JS生成CSV文件并下載csv是一種逗號分隔的表格文件格式,可以很好的被Excel支持,由于其文件格式簡單,所以經(jīng)常用在簡單的表格上面。最重要的是它是一種純文本格式,可以很輕松地用JS來生成而不借助第三方庫。
不考慮兼容性的保存CSV方法:/** * 保存CSV文件 * @params csv csv文件內(nèi)容 * @params saveName 保存的文件名 */ function saveCSV(csv, saveName){ var a = document.createElement("a"); a.href = "data:text/csv;charset=utf-8,ufeff" + encodeURIComponent(csv); a.download = saveName; a.click(); }
雖然我們用的是UTF-8編碼,下載后你會發(fā)現(xiàn),用文本編輯器打開沒問題,但是用Excel打開亂碼:文字換行問題
原因就是少了一個ufeffBOM頭,所以在data里面添加一個ufeff解決了
文字換csv的最大問題就是如何處理換行,很簡單,使用` `,` `后再用encodeURIComponent編碼一下就可以了。
大部分瀏覽器可能都沒啥問題,但是一些比較老的Chrome可能下載的時候指定的download就是不生效,此時可以用blob來解決:(測試此方法測試在微軟Edge瀏覽器和IE11下都無法下載)
考慮兼容性的保存CSV方法:/** * 保存CSV文件 * @params csv csv文件內(nèi)容 * @params saveName 保存的文件名 */ function saveCSV(csv, saveName) { var blob = new Blob(["ufeff" + csv], {type: "text/csv,charset=UTF-8"}); openDownloadDialog(blob, saveName); }
此方法測試在微軟Edge瀏覽器可以實(shí)現(xiàn)下載,但是在IE11下還是無法下載
封裝下載函數(shù)const openDownloadDialog = (url, saveName) => { if (typeof url === "object" && url instanceof Blob) { url = URL.createObjectURL(url); // 創(chuàng)建blob地址 } const aLink = document.createElement("a"); aLink.href = url; aLink.download = saveName; aLink.click(); };txt文件
下載text文件只需要修改一下文件類型就行了
function saveTXT(csv, saveName) { var blob = new Blob(["ufeff" + csv], {type: "text/txt,charset=UTF-8"}); openDownloadDialog(blob, saveName); }注意事項
保存文件的文件名后綴會影響打開方式,如果是.csv的文件名,默認(rèn)打開為excel,.txt文件結(jié)尾的默認(rèn)打開方式為text文件。所以這點(diǎn)需要注意
參考代碼我自己在項目中的封裝
downLoadTools.js
const openDownloadDialog = (url, saveName) => { if (typeof url === "object" && url instanceof Blob) { url = URL.createObjectURL(url); // 創(chuàng)建blob地址 } const aLink = document.createElement("a"); aLink.href = url; aLink.download = saveName; aLink.click(); }; export default { /** * 保存CSV文件 * @params csv csv文件內(nèi)容 * @params saveName 保存的文件名 */ saveCSV: (csv, saveName) => { const blob = new Blob(["ufeff" + csv], {type: "text/csv,charset=UTF-8"}); openDownloadDialog(blob, `${saveName}.csv`); }, saveTXT: (csv, saveName) => { // const href = "data:text/txt;charset=utf-8,ufeff" + encodeURIComponent(csv); // ie瀏覽器不支持 const blob = new Blob(["ufeff" + csv], {type: "text/tet,charset=UTF-8"}); openDownloadDialog(blob, `${saveName}.txt`); } };
頁面引用
import downLoadTools from "@/utils/downLoadTools"; // 引入 downLoadTools.saveTXT(csv, "文件名"); // csv是一個字符串, 最終會下載一個 文件名.txt 的文件
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/95429.html
摘要:是否則檢驗指定的對象是否存在。由于的模塊實(shí)現(xiàn)主要調(diào)用庫,所以各個平臺可能有所不同。時間格式時間戳的方式通常來說,時間戳是指格林威治時間年月日時分秒北京時間年月日時分秒起至現(xiàn)在的總秒數(shù)。元組方式元組共有個元素,返回的函數(shù)主要有,,。 os模塊 os模塊提供了多數(shù)操作系統(tǒng)的功能接口函數(shù)。當(dāng)os模塊被導(dǎo)入后,它會自適應(yīng)于不同的操作系統(tǒng)平臺,根據(jù)不同的平臺進(jìn)行相應(yīng)的操作,在python編程時,...
摘要:聚合函數(shù)將一列數(shù)據(jù)作為一個整體,進(jìn)行縱向的計算。計算個數(shù)一般選擇非空的列主鍵計算最大值計算最小值計算和計算平均值注意聚合函數(shù)的計算,排除值。 MySQL數(shù)據(jù)庫 開發(fā)學(xué)習(xí)中,想滿足一些需求,無疑需要經(jīng)常與數(shù)據(jù)打交道,例如,我們在使用IO的一些技術(shù)的時候,常常需要將一些數(shù)據(jù)存儲到外部文件,可能大家會問,我們初學(xué)的時候常常會簡單的保存一些數(shù)據(jù)到 .txt 文件中,為什么還需要數(shù)據(jù)庫呢? (一...
閱讀 3768·2021-09-02 15:11
閱讀 4773·2021-08-16 10:47
閱讀 1661·2019-08-29 18:35
閱讀 3180·2019-08-28 17:54
閱讀 2932·2019-08-26 11:37
閱讀 1574·2019-08-23 16:51
閱讀 1897·2019-08-23 14:36
閱讀 1879·2019-08-23 14:21