摘要:本篇所說的文件下載也是基于和或者都行。的返回值是一個有意思的對象,它包含了很多方法,其中一個方法就是。通過的響應(yīng)頭獲取到文件名。接下來就是對標(biāo)簽的一系列操作,然后模擬點擊事件觸發(fā)下載動作。
距離上次博文更新已經(jīng)快一個月了,期間忙于各種事情無法脫身。今天難得閑暇 and then 就來更新啦...
上篇中我們了解了下載React中如何實現(xiàn)文件的上傳,雖然不算什么高大上的技術(shù)但實際開發(fā)的時候會讓自己更加的游刃有余。今天繼續(xù)更新另一個相關(guān)的技術(shù) --> 文件的下載
看過上篇博文的朋友應(yīng)該有印象,做文件上傳的功能可以用Form表單、fetch(Ajax或者Axios都行)和Form+fetch這三個方法。后臺采用express框架,由于fetch請求會涉及到跨域問題,所以后臺還使用了Cors中間件來解決跨域的問題。這一點在上篇博文中都有提及所以在這里就不加贅述。
本篇所說的文件下載也是基于Form和fetch(Ajax或者Axios都行)。且聽慢慢道來...
Form表單可謂是前端界的萬金油,什么數(shù)據(jù)提交、上傳下載都樣樣精通,最關(guān)鍵的是:不需要考慮跨域。
利用Form表單進行文件下載很簡單,只需要幾行代碼就可以搞定:
class FormDownload extends Component { render() { return () } } export default FormDownload;
只要這一小段代碼就可以實現(xiàn)文件的下載,是不是很開森?
Fetch利用Fetch實現(xiàn)文件下載相比于Form那就顯得很麻煩也很啰嗦,為什么呢?上代碼先
class FetchDownload extends Component { download = () => { fetch("http(s)://下載文件的后臺接口").then(res => res.blob().then(blob => { let a = document.createElement("a"); let url = window.URL.createObjectURL(blob); let filename = res.headers.get("Content-Disposition"); if (filename) { filename = filename.match(/"(.*)"/)[1]; //提取文件名 a.href = url; a.download = filename; //給下載下來的文件起個名字 a.click(); window.URL.revokeObjectURL(url); a = null; } })); }; render() { return ( ) } } export default FetchDownload;
麻煩在哪兒:
1、需要考慮跨域問題
2、需要對返回值進行轉(zhuǎn)化
3、需要有DOM操作(生成a標(biāo)簽和銷毀a標(biāo)簽)
下面就一起來看看具體操作步驟:
用fetch訪問后臺接口并接受后臺返回值。因為fetch方法返回一個Promise對象,因此我們可以在then用獲取到它的返回值
這一步就厲害了。fetch的返回值是一個有意思的對象,它包含了很多方法,其中一個方法就是blob()。這個方法可以將fetch的返回值轉(zhuǎn)化成Blob對象。
利用document.createElement創(chuàng)建一個a標(biāo)簽
利用window.URL.createObjectURL將blob數(shù)據(jù)轉(zhuǎn)成對應(yīng)url。
通過fetch的響應(yīng)頭獲取到文件名res.headers.get("Content-Disposition")。這里需要mark下,因為我們后臺使用了Cors中間件來解決跨域問題,因此需要做特別的設(shè)置來讓Cors將響應(yīng)頭給暴露出來"exposedHeaders": "*",具體的大家可以看后臺代碼。
接下來就是對a標(biāo)簽的一系列操作,然后模擬點擊事件觸發(fā)下載動作。
最后需要將轉(zhuǎn)化出來的url進行銷毀window.URL.revokeObjectURL(url),a標(biāo)簽置為null
看完整個過程,除了了解到前面所說的麻煩,我們依然要看到其優(yōu)點所在。對于Form實現(xiàn)的下載功能,我們只能做下載,而不能做額外的事情;但是使用fetch我們可以將獲取到的數(shù)據(jù)做更多的處理,自由度相對較高。
總結(jié)目前這方面的輪子特別多而且很是花里胡哨(但是用的特別爽,真香系列!),不過最基礎(chǔ)的往往也就這么點技術(shù)。萬丈高樓平地起,學(xué)好基礎(chǔ)何怕不會造輪子。。。哈哈。另外再把demo貼一下,有興趣的同學(xué)可以下載下來跑一下溜溜
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/108807.html
摘要:前言本期的主題是在中如何實現(xiàn)文件上傳。文件上傳解決方案目前比較主流的解決方案就是表單或者和表單來實現(xiàn)。文件上傳解決方案表單利用表單組件進行文件上傳是遠(yuǎn)古時期就一直在用的方法而且還真經(jīng)久不衰,厲害了。 終于抽出時間來繼續(xù)更新自己的博客,最近忙得夠嗆...對于該系列博客不知道大家有沒有這樣的看法,對于React常見的基礎(chǔ)東西并沒有過多或者詳細(xì)列出,感覺有點不符合系列標(biāo)題。的確,筆者一開始也...
摘要:驗證路由所謂的驗證路由其實就是該路由的外層加了一層驗證機制,有授權(quán)的用戶才能進入,反之都無法進入。一起學(xué)系列也隨著這篇的結(jié)束而告一段落了。大家一起加油最后再獻上和本篇博文有關(guān)的代碼鏈接和示例頁面 時隔那么久,博主終于從睡夢中醒來開始更新博客啦!為自己的勤勞歡呼...(pia pia pia打臉)!本次我們接著上一篇博客繼續(xù)聊React-Router4。上篇我們主要了解了React-Ro...
摘要:中的包中的包主要有三個和。的理念上面提到的理念是一切皆組件以下統(tǒng)一稱組件。從這點來說的確方便了不少,也迎合一切皆組件的理念。組件是中主要的組成單位,可以認(rèn)為是或的路由入口。將該標(biāo)示為嚴(yán)格匹配路由。的屬性追加一條。 2019年不知不覺已經(jīng)過去19天了,有沒有給自己做個總結(jié)?有沒有給明年做個計劃?當(dāng)然筆者已經(jīng)做好了明年的工作、學(xué)習(xí)計劃;同時也包括該系列博客剩下的博文計劃,目前還剩4篇:分別...
摘要:所以還是印證那句話是組件渲染的唯一依據(jù)。所以對組件的進行約束是創(chuàng)建一個健康組件的必要條件。這里我們約束屬性類型為。使用方式運行結(jié)果沒有錯誤假如我們再加入一個子組件控制臺如預(yù)期報錯自定義約束萬物皆有其局限性。 日常扯淡前的廢話 上一篇我們介紹了React中State對象,說到它是組件渲染的唯一依據(jù);當(dāng)然我們也可以認(rèn)為State是組件中的數(shù)據(jù)源之一,它保存著組件渲染的所有數(shù)據(jù)并且可以直接作...
摘要:但這樣做的缺點很多,不利于狀態(tài)在組件之間共享。所以本篇使用作為狀態(tài)管理器來實現(xiàn)時間旅行。并且從中可以看出過程不僅僅向?qū)ο笾刑砑右粋€狀態(tài)對象,還對進行了加一操作,這是為了保證狀態(tài)與保持同步。 距離上一次更新已經(jīng)有半個月了,這半個月來主要在忙兩件事:一個是最近老板給了個自動化測試任務(wù),另一個是和學(xué)校的弟弟一起搞一個微信小游戲...emmmm!其實主要是懶!!! 本篇是作為上篇的續(xù)集,不知道...
閱讀 1641·2021-09-22 15:21
閱讀 2861·2021-09-09 09:32
閱讀 2681·2021-09-02 09:52
閱讀 3299·2019-08-30 14:02
閱讀 2218·2019-08-26 13:25
閱讀 1446·2019-08-26 13:24
閱讀 1599·2019-08-26 10:31
閱讀 1552·2019-08-26 10:16