摘要:尤其是通過生成文件內(nèi)容,然后通過瀏覽器端執(zhí)行下載的操作。日前,項(xiàng)目中就遇到了這類需求,在瀏覽器端實(shí)現(xiàn)保存當(dāng)前網(wǎng)頁為圖片,然后還可以下載。提供了一種創(chuàng)建對象的方法,但是兼容性堪憂,絕大部分瀏覽器都沒有實(shí)現(xiàn)。
問題場景
在前端很多的項(xiàng)目中,文件下載的需求很常見。尤其是通過JS生成文件內(nèi)容,然后通過瀏覽器端執(zhí)行下載的操作。如圖片,Execl 等的導(dǎo)出功能。日前,項(xiàng)目中就遇到了這類需求,在瀏覽器端實(shí)現(xiàn)保存當(dāng)前網(wǎng)頁為圖片,然后還可以下載。
解決方案 網(wǎng)頁生成圖片這里可以采用 html2canvas 來實(shí)現(xiàn)。并且可以兼容大部分主流的瀏覽器。
Firefox 3.5+
Google Chrome
Opera 12+
IE9+
Safari 6+
文件下載 第一種方案HTML5 新增了 download 屬性,只要給 download 加上想要導(dǎo)出的文件名即可。如 download="file.jpg"。想要詳細(xì)的了解此屬性,可以參考 張鑫旭 寫的一篇博文,傳送門。
簡單代碼實(shí)現(xiàn)如下:
import html2canvas from "html2canvas"; // 生成圖片,并自動(dòng)下載 function captureScreenshot() { const preview = document.querySelector(".preview-graphs"); html2canvas(preview).then((canvas) => { var img = document.createElement("a"); img.href = canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream"); // 下載的文件名字 img.download = `file.jpg`; img.click(); }) }
Note:上述實(shí)現(xiàn),目前只有 Google Chrome 功能是正常的。兼容性存在很大的問題。
第二種方案這里可以采用 FileSaver.js。需以 Blob 的形式來進(jìn)行保存。canvas 提供了一種創(chuàng)建 Blob 對象的方法 canvas.toBlob((blob) => {}) ,但是兼容性堪憂,絕大部分瀏覽器都沒有實(shí)現(xiàn)。因此官網(wǎng)特意提供了這樣的一個(gè)庫,canvas-toBlob.js。
FileSaver.js is the solution to saving files on the client-side, and is perfect for web apps that generates files on the client, However if the file is coming from the server we recommend you to first try to use Content-Disposition attachment response header as it has more cross-browser compatible. - 摘自官網(wǎng)FileSaver.js 是在客戶端保存文件的解決方案,非常適合在客戶端生成文件的Web應(yīng)用程序,但是如果文件來自服務(wù)器,我們建議您首先嘗試使用 Content-Disposition 附件響應(yīng) 標(biāo)題,因?yàn)樗懈嗟目鐬g覽器兼容。
可以兼容主流的瀏覽器,如 Firefox,Chrome,Edge,IE 10+ 等。
代碼實(shí)現(xiàn)如下:
import html2canvas from "html2canvas"; import FileSaver from "file-saver"; // 這里沒有用 canvas-toBlob.js // base64 轉(zhuǎn)換成 Blob function dataURLToBlob(dataURL) { var BASE64_MARKER = ";base64,"; var parts; var contentType; var raw; if (dataURL.indexOf(BASE64_MARKER) === -1) { parts = dataURL.split(","); contentType = parts[0].split(":")[1]; raw = decodeURIComponent(parts[1]); return new Blob([raw], {type: contentType}); } parts = dataURL.split(BASE64_MARKER); contentType = parts[0].split(":")[1]; raw = window.atob(parts[1]); var rawLength = raw.length; var uInt8Array = new Uint8Array(rawLength); for (var i = 0; i < rawLength; ++i) { uInt8Array[i] = raw.charCodeAt(i); } return new Blob([uInt8Array], {type: contentType}); } // 生成圖片,并自動(dòng)下載 function captureScreenshot() { const preview = document.querySelector(".preview-graphs"); html2canvas(preview).then((canvas) => { const fileBlob = dataURLToBlob(canvas.toDataURL("image/jpeg").replace("image/jpeg", "image/octet-stream")); const fileName = `file.jpg`; FileSaver.saveAs(fileBlob, fileName); }); }相關(guān)鏈接
Blob
HTMLCanvasElement.toBlob()
HTMLCanvasElement.toDataURL()
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/101133.html
摘要:測試說明位位位位服務(wù)端實(shí)現(xiàn)下載通過修改響應(yīng)頭,告訴瀏覽器這個(gè)請求回來的是個(gè)附件。控制用戶請求所得的內(nèi)容存為一個(gè)文件的時(shí)候提供一個(gè)默認(rèn)的文件名,文件直接在瀏覽器上顯示或者在訪問時(shí)彈出文件下載對話框。 測試說明 Chrome 65.0.3325.181 (64 位) Chrome 69.0.3497.92 (64 位) IE 11.0.9600.19002 (64 位) Firefox ...
摘要:一需求的場景在我們的需求中需要有一個(gè)在手機(jī)瀏覽器端,用戶實(shí)現(xiàn)上傳證件照片的功能,我們第一版上了一個(gè)最簡版,直接讓用戶在本地選擇圖片,然后上傳到公司公共的服務(wù)器上。 一、需求的場景: 在我們的需求中需要有一個(gè)在手機(jī)瀏覽器端,用戶實(shí)現(xiàn)上傳證件照片的功能,我們第一版上了一個(gè)最簡版,直接讓用戶在本地選擇圖片,然后上傳到公司公共的服務(wù)器上。 功能實(shí)現(xiàn)后我們發(fā)現(xiàn)一個(gè)問題,公司公共的服務(wù)器有2M...
摘要:一需求的場景在我們的需求中需要有一個(gè)在手機(jī)瀏覽器端,用戶實(shí)現(xiàn)上傳證件照片的功能,我們第一版上了一個(gè)最簡版,直接讓用戶在本地選擇圖片,然后上傳到公司公共的服務(wù)器上。 一、需求的場景: 在我們的需求中需要有一個(gè)在手機(jī)瀏覽器端,用戶實(shí)現(xiàn)上傳證件照片的功能,我們第一版上了一個(gè)最簡版,直接讓用戶在本地選擇圖片,然后上傳到公司公共的服務(wù)器上。 功能實(shí)現(xiàn)后我們發(fā)現(xiàn)一個(gè)問題,公司公共的服務(wù)器有2M...
摘要:前端開發(fā)的朋友們可能會(huì)遇到這個(gè)需求將您負(fù)責(zé)開發(fā)的網(wǎng)頁的全部內(nèi)容,包括文字和圖片,一起保存成一個(gè)文件。在您的前端頁面里畫一個(gè)按鈕,用于觸發(fā)將當(dāng)前網(wǎng)頁保存成文件的事件。 前端開發(fā)的朋友們可能會(huì)遇到這個(gè)需求:將您負(fù)責(zé)開發(fā)的網(wǎng)頁的全部內(nèi)容,包括文字和圖片,一起保存成一個(gè)PDF文件。如果采用屏幕截圖的話,默認(rèn)Windows操作系統(tǒng)的截圖按鈕無法完整截取超過一屏幕的屏幕內(nèi)容。 我在網(wǎng)上找了一段時(shí)間...
閱讀 1456·2021-09-22 15:43
閱讀 2171·2019-08-30 15:54
閱讀 1174·2019-08-30 10:51
閱讀 2096·2019-08-29 18:35
閱讀 439·2019-08-26 11:58
閱讀 2491·2019-08-26 11:38
閱讀 2450·2019-08-23 18:35
閱讀 3648·2019-08-23 18:33