麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > JavaScript > 正文

Emberjs 通過 axios 下載文件的方法

2019-11-19 10:54:14
字體:
供稿:網(wǎng)友

摘要: 目前項(xiàng)目中需要與后端合作,通過發(fā)送 GET 請(qǐng)求,后端返回文件流,前端進(jìn)行文件的下載。

使用到的技術(shù)有:

  1. Emberjs
  2. axios

思路

接到這個(gè)需求的話,想著使用創(chuàng)建 a 鏈接,然后模擬點(diǎn)擊 a 鏈接來完成下載,但是情況不是這樣的。后端有多于一個(gè)的下載接口,首先是生成下載文件的接口, 這個(gè)接口主要是返回 需要下載的文件的 name 以及相應(yīng)的接口地址。而下載的文件可能不止一個(gè),同時(shí),對(duì)文件接口地址發(fā)送 GET 請(qǐng)求,會(huì)返回文件流,但是我們需要的是 CSV 格式的文件,所以想到通過 axios 來實(shí)現(xiàn)這個(gè)需求。

具體做法

既然方向確定了,那就是去做了。

在項(xiàng)目中安裝插件/導(dǎo)入 axios

現(xiàn)在 Emberjs 封裝好的 axios 插件 - ember-axios ,使用 ember install axios 。這個(gè)插件沒有文檔,所以只能看源碼,還好源碼比較簡(jiǎn)單,就是簡(jiǎn)單的將 axios 的一些方法封裝成一個(gè) service 內(nèi)的方法。

在項(xiàng)目文件中引入 axios

安裝后在 Emberjs 項(xiàng)目中將此 service 引入近來

import { inject as service } from '@ember/service';export default Controller.extend({ // ... axios: service() // ...});

這樣即可使用這個(gè)插件中封裝的一些 axios 的方法。

使用

之前也說過當(dāng)前項(xiàng)目需要先發(fā)送一個(gè)請(qǐng)求,請(qǐng)求文件的接口地址。返回的值的格式為:

{ "fileNames":[  "filename=downloadFile1.csv",  "filename=downloadFile2.csv" ], "status":"ok"}

可以看到,如我們所想的那樣,返回的并不一定是單個(gè)文件的地址,所以我們?cè)诮邮盏竭@個(gè)數(shù)據(jù)后:

import { isEmpty } from '@ember/utils';import { all, reject } from 'rsvp';//....then(data=> { if (data.status !== 'ok' || isEmpty(data.fileNames)) {  return reject(); } return all(data.fileNames.map(ele => {  return axios.axios({   url: `${ele}`,   method: 'get',   responseType: 'blob'  }); }));});

在等待上面的請(qǐng)求發(fā)送成功之后,我們看看這段代碼的意思。最上面的兩個(gè) import 是引入的一些 Emberjs 中封裝的一些通用方法以及 promies 方法.在 then 之內(nèi)的代碼,先是驗(yàn)證是否返回成功。然后對(duì)數(shù)據(jù)進(jìn)行遍歷,并發(fā)送 axios 封裝的 get 請(qǐng)求。 其中 axios.axios() ember-axios 封裝的 axios.create(this.config()) 源碼地址 ,同時(shí)注意的是 config 對(duì)象中 responseType 填寫的是 blob ,這是保證文件能夠下載成功的基礎(chǔ)。

請(qǐng)求發(fā)送成功之后,我們需要對(duì)返回的數(shù)據(jù)進(jìn)行處理,也就是:

.then(data => { data.forEach((res, index) => {  const content = res.data,   blob = new Blob([content], { type: 'text/csv' }),   fileName = fileNames[index];  if ('download' in document.createElement('a')) { // 非IE下載   const elink = document.createElement('a');   elink.download = fileName;   elink.style.display = 'none';   elink.href = URL.createObjectURL(blob);   document.body.appendChild(elink);   elink.click();   URL.revokeObjectURL(elink.href); // 釋放URL 對(duì)象   document.body.removeChild(elink);  } else { // IE10+下載   navigator.msSaveBlob(blob, fileName);  } });}).catch(() => {});

這段代碼需要注意的是我們 new Blob() 接收的是 res.data 這個(gè)需要特別注意。另外就是此方法的第二個(gè)參數(shù)接收的 {type: 'text/csv'} ,因?yàn)榇雾?xiàng)目下載的是 csv 文件格式,其他的可以參考 MIME . 其他的就是創(chuàng)建一個(gè) display:none 的 a 標(biāo)簽,并觸發(fā)點(diǎn)擊事件。這時(shí)候?yàn)g覽器就會(huì)進(jìn)行下載。

總結(jié)

這算是在 Embjerjs 中進(jìn)行下載流文件的一次船新嘗試。

以上所述是小編給大家介紹的Emberjs 通過 axios 下載文件的方法,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)武林網(wǎng)網(wǎng)站的支持!
如果你覺得本文對(duì)你有幫助,歡迎轉(zhuǎn)載,煩請(qǐng)注明出處,謝謝!

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 亚洲码无人客一区二区三区 | 久久精品视频2 | 久草视频国产在线 | 中文字幕爱爱视频 | 成人免费自拍视频 | 欧美囗交 | 一级电影在线免费观看 | 国产激情视频在线 | 成人在线视频免费观看 | 鲁丝一区二区二区四区 | 黄色毛片一级 | 久久久看| 在线成人免费av | 欧美不卡| 一级做人爱c黑人影片 | 亚洲资源在线播放 | 久草手机在线 | 久久亚洲成人 | 国内精品久久久久久久久久久久 | 欧美激情猛片xxxⅹ大3 | 欧美黄 片免费观看 | 国产精品一区二区三区在线看 | 黄色毛片免费视频 | 日本aaaa片毛片免费观蜜桃 | 国产在线播放91 | 国产羞羞视频在线观看 | 国产成人自拍视频在线观看 | 美女久久久久久久久 | 亚洲二区不卡 | 欧产日产国产精品v | 日日草夜夜操 | 99成人在线| 欧美特级一级毛片 | 欧美黄一级 | 在线日韩av电影 | 一区二区三区欧美在线 | 日日操夜| 最新中文在线视频 | 欧美一级免费视频 | 天堂成人国产精品一区 | 性爱视频在线免费 |