vue如何使用文件流進(jìn)行下載(new Blob)
vue使用文件流進(jìn)行下載(new Blob)
封裝方法
function getExel(url, params, index) {+
? return new Promise(function(resolve, reject) {
? ? let data = {
? ? ? method: "GET",
? ? ? url:url,
? ? ? headers: {
? ? ? ? 'token': ?gettoken("token")
? ? ? },
? ? ? responseType: 'arraybuffer'
? ? }
? ? resolve(axios(data));
? })
}注意:responseType應(yīng)設(shè)置為:'arraybuffer'
發(fā)送請求($Api已經(jīng)掛載在了vue對象上,所以可以這么使用)
this.$Api.getExel("/goodsCheckService/v1/planMaterial/export?idList="+idArray)
? ? ? ? ? .then(response => {
? ? ? ? ? ? ? let a = document.createElement('a');
?
? ? ? ? ? ? ? //ArrayBuffer 轉(zhuǎn)為 Blob
? ? ? ? ? ? ? let blob = new Blob([response.data], {type: "application/vnd.ms-excel"});?
? ? ? ? ? ? ??
? ? ? ? ? ? ? let objectUrl = URL.createObjectURL(blob);
? ? ? ? ? ? ? a.setAttribute("href",objectUrl);
? ? ? ? ? ? ? a.setAttribute("download", '計(jì)劃單電子表格.xls');
? ? ? ? ? ? ? a.click();
});vue下載文件流完整前后端代碼
使用Vue時(shí),我們前端如何處理后端返回的文件流
首先后端返回流,這里我把流的動(dòng)作拿出來了,我很多地方要用
? ? /**
? ? ?* 下載單個(gè)文件
? ? ?*
? ? ?* @param docId
? ? ?*/
? ? @GetMapping("/download/{docId}")
? ? public void download(@PathVariable("docId") String docId,
? ? ? ? ? ? ? ? ? ? ? ? ?HttpServletResponse response) {
? ? ? ? outWrite(response, docId);
? ? }
? ??
?? ?/**
? ? ?* 輸出文件流
? ? ?* @param response
? ? ?* @param docId
? ? ?*/
? ? private void outWrite(HttpServletResponse response, String docId) {
? ? ? ? ServletOutputStream out = null;
? ? ? ? try {
? ? ? ? ? ? out = response.getOutputStream();
? ? ? ? ? ? // 禁止圖像緩存。
? ? ? ? ? ? response.setHeader("Pragma", "no-cache");
? ? ? ? ? ? response.setHeader("Cache-Control", "no-cache");
? ? ? ? ? ? response.setDateHeader("Expires", 0);
? ? ? ? ? ? byte[] bytes = docService.downloadFileSingle(docId);
? ? ? ? ? ? if (bytes != null) {
? ? ? ? ? ? ? ? MagicMatch match = Magic.getMagicMatch(bytes);
? ? ? ? ? ? ? ? String mimeType = match.getMimeType();
? ? ? ? ? ? ? ? response.setContentType(mimeType);
? ? ? ? ? ? ? ? response.addHeader("Content-Length", String.valueOf(bytes.length));
? ? ? ? ? ? ? ? out.write(bytes);
? ? ? ? ? ? }
? ? ? ? ? ? out.flush();
? ? ? ? } catch (Exception e) {
? ? ? ? ? ? UnitedLogger.error(e);
? ? ? ? } finally {
? ? ? ? ? ? IOUtils.closeQuietly(out);
? ? ? ? }
? ? }前端這里我引入了一個(gè)組件 js-file-download
npm install js-file-download --save
然后在Vue文件中添加進(jìn)來
import fileDownload from "js-file-download";
? ?// 文檔操作列對應(yīng)事件
? ? async handleCommand(item, data) {
? ? ? switch (item.key) {
? ? ? ? case "download":
? ? ? ? ? var res = await this.download(data);
? ? ? ? ? return fileDownload(res, data.name);
? ? ? ? ...
? ? ? ? default:
? ? ? }
? ? ? // 刷新當(dāng)前層級的列表
? ? ? const folder = this.getLastFolderPath();
? ? ? this.listClick(folder.folderId, folder.name);
? ? },
? ? // 下載
? ? async download(row) {
? ? ? if (this.isFolder(row.type)) {
? ? ? ? return FolderAPI.download(row.id);
? ? ? } else {
? ? ? ? return DocAPI.download(row.id);
? ? ? }
? ? },docAPI js 注意需要設(shè)置responseType
/**
?* 下載單個(gè)文件
?* @param {*} id
?*/
const download = (id) => {
? return request({
? ? url: _DataAPI.download + id,
? ? method: "GET",
? ? responseType: 'blob'
? });
};這樣即可成功下載
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vuex 中輔助函數(shù)mapGetters的基本用法詳解
mapGetters輔助函數(shù)僅僅是將 store 中的 getter 映射到局部計(jì)算屬性,在組件或界面中不使用mapGetter調(diào)用映射vuex中的getter,在組件或界面中使用mapGetter調(diào)用映射vuex中的getter,具體內(nèi)容跟隨小編一起通過本文學(xué)習(xí)吧2021-07-07
詳解Vue-cli webpack移動(dòng)端自動(dòng)化構(gòu)建rem問題
這篇文章主要介紹了詳解Vue-cli webpack移動(dòng)端自動(dòng)化構(gòu)建rem問題,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-04-04
vue本地模擬服務(wù)器請求mock數(shù)據(jù)的方法詳解
這篇文章主要給大家介紹了關(guān)于vue本地模擬服務(wù)器請求mock數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-03-03
Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例
這篇文章主要介紹了Vue 動(dòng)態(tài)添加路由及生成菜單的方法示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
簡易Vue評論框架的實(shí)現(xiàn)(父組件的實(shí)現(xiàn))
本篇文章主要介紹了簡易 Vue 評論框架的實(shí)現(xiàn)(父組件的實(shí)現(xiàn)),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-01-01
vue composition-api 封裝組合式函數(shù)的操作方法
在 Vue 應(yīng)用的概念中,“組合式函數(shù)”(Composables) 是一個(gè)利用 Vue 的組合式 API 來封裝和復(fù)用有狀態(tài)邏輯的函數(shù),這篇文章主要介紹了vue composition-api 封裝組合式函數(shù)的操作方法,需要的朋友可以參考下2022-10-10

