国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

[ 一起學(xué)React系列 -- 9 ] React中的文件下載

Jacendfeng / 2226人閱讀

摘要:本篇所說(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ō)的文件下載也是基于Formfetch(Ajax或者Axios都行)。且聽(tīng)慢慢道來(lái)...

Form

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

相關(guān)文章

  • [ 一起學(xué)React系列 -- 8 ] React中的文件上傳

    摘要:前言本期的主題是在中如何實(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)始也...

    Travis 評(píng)論0 收藏0
  • [ 一起學(xué)React系列 -- 12 ] React-Router4 (2)

    摘要:驗(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...

    chaos_G 評(píng)論0 收藏0
  • [ 一起學(xué)React系列 -- 11 ] React-Router4 (1)

    摘要:中的包中的包主要有三個(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篇:分別...

    tinysun1234 評(píng)論0 收藏0
  • [ 一起學(xué)React系列 -- 3 ] UI的擴(kuò)展數(shù)據(jù)源Props以及Props約束

    摘要:所以還是印證那句話是組件渲染的唯一依據(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ù)并且可以直接作...

    kumfo 評(píng)論0 收藏0
  • [ 一起學(xué)React系列 -- 7 ] 秘術(shù)之時(shí)間旅行-2

    摘要:但這樣做的缺點(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ù)集,不知道...

    nidaye 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<