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