摘要:前言項(xiàng)目中經(jīng)常會(huì)遇到需要導(dǎo)出列表內(nèi)容,或者下載文件之類的需求。結(jié)合各種情況,我總結(jié)了前端最常用的三種方法來接受后端傳過來的文件流并下載,針對(duì)不同的情況可以使用不同的方法。如果后端提供的下載接口是類型,就必須要用方法二或者方法三了。
前言
項(xiàng)目中經(jīng)常會(huì)遇到需要導(dǎo)出列表內(nèi)容,或者下載文件之類的需求。結(jié)合各種情況,我總結(jié)了前端最常用的三種方法來接受后端傳過來的文件流并下載,針對(duì)不同的情況可以使用不同的方法。
方法一 使用場(chǎng)景針對(duì)后端的get請(qǐng)求
具體實(shí)現(xiàn)下載文件方法二 使用場(chǎng)景
針對(duì)后端的post請(qǐng)求
利用原生的XMLHttpRequest方法實(shí)現(xiàn)
function request () { const req = new XMLHttpRequest(); req.open("POST", "<接口地址>", true); req.responseType = "blob"; req.setRequestHeader("Content-Type", "application/json"); req.onload = function() { const data = req.response; const a = document.createElement("a"); const blob = new Blob([data]); const blobUrl = window.URL.createObjectURL(blob); download(blobUrl) ; }; req.send("<請(qǐng)求參數(shù):json字符串>"); }; function download(blobUrl) { const a = document.createElement("a"); a.style.display = "none"; a.download = "<文件名>"; a.href = blobUrl; a.click(); document.body.removeChild(a); } request();方法三 使用場(chǎng)景
針對(duì)后端的post請(qǐng)求
利用原生的fetch方法實(shí)現(xiàn)
function request() { fetch("<接口地址>", { method: "POST", headers: { "Content-Type": "application/json", }, body: "<請(qǐng)求參數(shù):json字符串>", }) .then(res => res.blob()) .then(data => { let blobUrl = window.URL.createObjectURL(data); download(blobUrl); }); } function download(blobUrl) { const a = document.createElement("a"); a.style.display = "none"; a.download = "<文件名>"; a.href = blobUrl; a.click(); document.body.removeChild(a); } request();總結(jié)
如果后端提供的下載接口是get類型,可以直接使用方法一,簡(jiǎn)單又便捷;當(dāng)然如果想使用方法二、三也是可以的,不過感覺有點(diǎn)舍近求遠(yuǎn)了。
如果后端提供的下載接口是post類型,就必須要用方法二或者方法三了。
方法二和方法三怎么取舍?當(dāng)你的項(xiàng)目里的接口請(qǐng)求全是基于XMLHttpRequest實(shí)現(xiàn)的,這時(shí)方法二就更加適合,只要基于你原來項(xiàng)目中的接口請(qǐng)求工具類加以擴(kuò)展就行了。
當(dāng)你的項(xiàng)目里的接口請(qǐng)求全是基于fetch實(shí)現(xiàn)的,這時(shí)方法三就更加適合,比如我現(xiàn)在的做的一個(gè)項(xiàng)目就是基于ant design pro的后臺(tái)管理系統(tǒng),它里面的請(qǐng)求類就是基于fetch的,所以我就直接用的方法三,只要在它的request.js文件中稍作修改就行。
我這里討論的是兩種原生的請(qǐng)求方式,如果你項(xiàng)目中引用了第三方請(qǐng)求包來發(fā)送請(qǐng)求,比如axios之類的,那就要另當(dāng)別論了。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/100079.html
摘要:而現(xiàn)在我們可以利用多種工具框架進(jìn)行跨平臺(tái)開發(fā)。實(shí)現(xiàn)視頻會(huì)議的幾種思路如何利用實(shí)現(xiàn)一個(gè)視頻會(huì)議應(yīng)用這主要取決于使用什么技術(shù)來實(shí)現(xiàn)作為業(yè)務(wù)核心的部分。通過與技術(shù)結(jié)合,實(shí)現(xiàn)了網(wǎng)頁端多方音視頻通訊,可以快速實(shí)現(xiàn)部分的開發(fā)。 作者簡(jiǎn)介:張乾澤,聲網(wǎng) Agora Web 研發(fā)工程師 對(duì)于在線教育、醫(yī)療、視頻會(huì)議等場(chǎng)景來講,開發(fā)面向 Windows、Mac 的跨平臺(tái)客戶端是必不可少的一步。在過去,每...
摘要:誤會(huì)說明此時(shí)間不是指時(shí)間刻,而是時(shí)間段小時(shí)分鐘秒,時(shí)間刻以及日期推薦此主要單位指常用的時(shí),分,秒,時(shí)分秒,時(shí)分,分秒,無日期無毫秒此一個(gè)單位數(shù)值保留兩位小數(shù),多個(gè)單位不考慮小數(shù)目前需求暫時(shí)不多,只是一個(gè)小轉(zhuǎn)換。 還有很多需要學(xué)習(xí),此生不用回頭了。 誤會(huì)說明 此時(shí)間不是指時(shí)間刻(12:00:00),而是時(shí)間段(3小時(shí)10分鐘45秒),時(shí)間刻以及日期推薦 moment.js 此主要單...
摘要:如果像本例中這樣的場(chǎng)景會(huì)遇到這樣一個(gè)問題,詳見鏈接當(dāng)請(qǐng)求參數(shù)過長(zhǎng)或?yàn)榱税踩托枰玫较螺d。寫到這里自己都忍不住想錘自己,給自己挖坑不說,這樣來回請(qǐng)求下載,流量,真的是敗家。 這幾天一直在做遠(yuǎn)程文件下載的事,現(xiàn)在總算有了解決,特來記錄一下踩過的坑和想揍自己的心 需求 應(yīng)用場(chǎng)景是這樣的,底層邏輯數(shù)據(jù)請(qǐng)求接口是由Java寫的,也就是說原始文件存在Java服務(wù)端,返回時(shí)有加密措施 由于工作...
摘要:前言雖然使用構(gòu)造函數(shù)或者使用對(duì)象字面量可以很方便的用來創(chuàng)建一個(gè)對(duì)象,但這種方式有一個(gè)明顯的缺點(diǎn)使用一個(gè)接口創(chuàng)建多個(gè)對(duì)象會(huì)產(chǎn)生很多冗余的代碼。即調(diào)用構(gòu)造函數(shù)所創(chuàng)建的那個(gè)對(duì)象的原型對(duì)象好處是可以讓所有對(duì)象的實(shí)例共享他的屬性的方法。 前言 雖然使用Object構(gòu)造函數(shù)或者使用對(duì)象字面量可以很方便的用來創(chuàng)建一個(gè)對(duì)象,但這種方式有一個(gè)明顯的缺點(diǎn):使用一個(gè)接口創(chuàng)建多個(gè)對(duì)象會(huì)產(chǎn)生很多冗余的代碼。因此...
閱讀 1888·2021-11-25 09:43
閱讀 3179·2021-11-15 11:38
閱讀 2721·2019-08-30 13:04
閱讀 495·2019-08-29 11:07
閱讀 1509·2019-08-26 18:37
閱讀 2745·2019-08-26 14:07
閱讀 596·2019-08-26 13:52
閱讀 2292·2019-08-26 12:09