關于前端文件下載各類方式大匯總
總結:下載文件的方式
- a 標簽配置 download 屬性 (適用于下載一些靜態(tài)資源)
- window.location.href (適用于下載一些靜態(tài)資源)
- a 標簽 + Blob 方式
- 使用 form 表單提交
1.a 標簽配置 download 屬性
<a href="test.zip" rel="external nofollow" download="test.zip">download</a>
download 用來命名下載文件,以及防止 txt , jpg , pdf 等瀏覽器支持直接打開的文件不能下載(需要注意的是,href地址不能寫完整的域名,否則只能預覽也不能下載。另外,下載的地址域名和訪問網(wǎng)站的域名必須是同源,否則 download 設置無效)。
2.window.location.href/window.open()
window.location.href = '你的 url'; // 或 window.open('你的 url');
這種方式比較常見,比如我們在一些網(wǎng)站上下載電子書,安裝包之類的,一般都是這種方式或 a 標簽方式下載的。
3.<a> 標簽 + Blob方式
1.下載 api
export function downloadApi() { return request({ url: '/testApi', method: 'get', responseType: 'blob' }) }
注:這里的 request 是用 axios 封裝的一個方法,詳情可見:vue開發(fā)中 axios 的封裝
2.項目下載操作代碼
// vue 代碼 downClick () { downloadApi().then(resBlob => { this._download(resBlob) }) }, _downloads (resBlob) { const projectName = '項目.zip' // IE|Edge if (window.navigator && window.navigator.msSaveOrOpenBlob) { window.navigator.msSaveBlob(resBlob, projectName) } else { // 其他瀏覽器 const blobUrl = window.URL.createObjectURL(resBlob) const a = document.createElement('a') a.style.display = 'none' a.download = projectName a.href = blobUrl document.body.appendChild(a) // 兼容火狐 a.click() document.body.removeChild(a) window.URL.revokeObjectURL(blobUrl) } },
這里我們使用了 a 標簽加 blob 的方式,這種方式適用于下載響應比較耗時的情況。它會提前將文件下載完成后,再由前端進行下載。比如,后端在下載前需要進行一系列耗時操作來生成下載文件,這會讓用戶誤以為沒有正確點擊下載而重復點擊下載按鈕。通過這種方式我們可以做一些loading 之類的處理。
當然,如果不需要 loading 之類的處理,可以直接通過 a 標簽點擊下載,而無需 blob 方式。
注意:
上面這個 blob 方式在我們下載失敗時仍然會下載文件,當我們要處理后端拋出的錯誤信息時,就行不通了。解決方法兩種:
3.1. 使用 Response(IE不支持)
downClick () { downloadApi().then(async resBlob => { let resObj = {} if (resBlob.size == 0) { // 沒有數(shù)據(jù)可導出 } else if (resBlob.type == 'application/json') { // 返回(錯誤)信息 resObj = await (new Response(resBlob)).text() // 得到錯誤信息 resObj = JSON.parse(resObj) } // ... 相關判斷處理 this._download(resBlob) }) },
3.2. 使用 FileReader
downClick () { downloadApi().then(resBlob => { let resObj = {} if (resBlob.size == 0) { // 沒有數(shù)據(jù)可導出 } else if (resBlob.type == 'application/json') { // 返回(錯誤)信息 const reader = new FileReader() reader.addEventListener('loadend', () => { // reader.result 包含被轉化為一個字符串內容的 blob resObj = JSON.parse(reader.result) if (/* 是錯誤信息 */) { // 相關判斷處理 } }) reader.readAsText(resBlob) } else { this._download(resBlob) } }) },
4.使用 form 表單提交
/** * 使用 form-data -post 方式導出文件 * @param url 導出地址 * @param params 參數(shù) */ const postFormDataFile = (url, params) => { const form = document.createElement('form') form.style.display = 'none' form.action = BASE_URL + url form.method = 'post' document.body.appendChild(form) // 動態(tài)創(chuàng)建 input 并給 value 賦值 for (const key in params) { const input = document.createElement('input') input.type = 'hidden' input.name = key input.value = params[key] form.appendChild(input) } form.submit() form.remove() }
注意:傳給后端的參數(shù)不是 json 對象的形式,而是 currentPage=2&pageSize=20 形式。
5.實現(xiàn)下載進度條
原理:設置 onDownloadProgress 事件
export function downloadProject(projectId) { return request({ url: downloadProjectUrl + projectId, method: 'get', responseType: 'blob', onDownloadProgress: function (event) { // 注意: 后端需要設置響應頭 Content-Length, 否則 event.lengthComputable 就會為 false, event.total 為 0 // event.loaded 得到當前已加載的數(shù)據(jù)大小, event.total 拿到總的數(shù)據(jù)大小, 通過兩者的比值就知道其進度。 console.log('event', event) } }) }
event 參數(shù)內容如下:
知識參考【MDN】:
WEB前端是干什么的?
在了解Web前端之前,我們要先了解一下什么是“WEB”。
WEB(World Wide Web)即全球廣域網(wǎng),也稱為萬維網(wǎng),它是一種基于超文本和HTTP的、全球性的、動態(tài)交互的、跨平臺的分布式圖形信息系統(tǒng)。
其實,WEB就是全球互聯(lián)網(wǎng)系統(tǒng)的統(tǒng)稱,再簡單點講,WEB就是互聯(lián)網(wǎng)。
Web前端是什么?
Web前端即給用戶展示的網(wǎng)頁頁面,也就是網(wǎng)站的前臺部分,這里面可能包含了設計、特效、用戶交互等。
Web前端開發(fā)就是創(chuàng)建Web頁面,或者APP等前端界面呈現(xiàn)給用戶的過程,通過HTML、CSS及JavaScript等衍生出來的各種技術、框架、解決方案,來實現(xiàn)互聯(lián)網(wǎng)產品的用戶界面交互。
那么,什么是HTML、CSS、JavaScript?
可以這么理解
1、HTML
HTML稱為超文本標記語言,是一種標識性的語言,制作網(wǎng)頁永遠離不開HTML。
HTML5是Web中核心語言HTML的規(guī)范。
因此,無論是PC端還是APP端的應用,前端樣式都離不開HTML5。
2、CSS
CSS就是層疊樣式表,它主要是對HTML標記的內容進行更加豐富的裝飾,并將網(wǎng)頁表現(xiàn)樣式與網(wǎng)頁結構分離的一種樣式設計語言。
CSS可以控制HTML頁面中的文本內容、圖片外形以及版面布局等外觀的顯示樣式。是一種用來表現(xiàn)HTML或XML等文件樣式的計算機語言。
通俗點講,CSS就是給網(wǎng)頁“化妝”的一種技術。
3、JavaScript
是一種屬于網(wǎng)絡的腳本語言,已經被廣泛用于Web應用開發(fā),常用來為網(wǎng)頁添加各式各樣的動態(tài)功能,為用戶提供更流暢美觀的瀏覽效果。
它是一種具有函數(shù)優(yōu)先的輕量級,解釋型或即時編譯型的高級編程語言。是一種基于原型、函數(shù)先行的語言,同時是一門多范式的語言,它支持面向對象編程,命令式編程,以及函數(shù)式編程。
JavaScript的作用主要用來向HTML頁面添加交互行為,可以這么理解,如果沒有JavaScript技術的支持,那么網(wǎng)頁會變成一種“只能看不能用”的觀賞性頁面。
Web前端開發(fā)技術在各類編程語言中,屬于相對入門簡單、易上手的編程技術,深受轉行人員、初學者的青睞。
Web前端技術可以做什么呢?
1、網(wǎng)站制作
這是掌握Web技術從業(yè)者最多的一個領域,網(wǎng)站制作就是網(wǎng)站通過頁面結構定位、合理布局、圖片文字處理、程序設計、數(shù)據(jù)庫設計等一系列工作的總和,也是將網(wǎng)站設計師制定的總體規(guī)劃用HTML的方式展示出來。
2、小程序開發(fā)
隨著微信用戶的不斷增加,微信在近幾年推出的小程序深受用戶喜愛,應用數(shù)量超過了一百萬,覆蓋200多個細分的行業(yè),日活用戶達到兩個億,各大企業(yè)都紛紛參入其中,也是Web前端開發(fā)人員一個不錯的選擇。
3、APP開發(fā)
App開發(fā),是指專注于手機應用軟件開發(fā)與服務。通常專指手機上的應用軟件,或稱手機客戶端。因此,專攻APP開發(fā),同樣是Web培訓后的就業(yè)方向,并且發(fā)展態(tài)勢不斷上升,未來前景廣闊。
隨著互聯(lián)網(wǎng)發(fā)展越來越多元,Web前端工程師的就業(yè)路徑也更加寬廣。現(xiàn)在越來越多的IT企業(yè),對用戶體驗更加注重,Web前端開發(fā)人員的行業(yè)需求量也一直不少。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
對象無length屬性時IE6/IE7中無法將其轉換成偽數(shù)組(ArrayLike)
對象無length屬性時IE6/7中無法將其轉換成偽數(shù)組(ArrayLike) 的解決方法,需要的朋友可以參考下。2011-07-07使用 js 簡單的實現(xiàn) bind、call 、aplly代碼實例
這篇文章主要介紹了使用 js 簡單的實現(xiàn) bind、call 、aplly代碼實例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-09-09火狐瀏覽器(firefox)下獲得Event對象以及keyCode
firefox Event對象2008-11-11使用plupload自定義參數(shù)實現(xiàn)多文件上傳
這篇文章主要介紹了使用plupload自定義參數(shù)實現(xiàn)多文件上傳的相關資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07