vue实现下载文件流完整前后端代码


Posted in Vue.js onNovember 17, 2020

使用Vue时,我们前端如何处理后端返回的文件流

首先后端返回流,这里我把流的动作拿出来了,我很多地方要用

/**
 * 下载单个文件
 *
 * @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);
    out.write(bytes);
   }
   out.flush();
  } catch (Exception e) {
   UnitedLogger.error(e);
  } finally {
   IOUtils.closeQuietly(out);
  }
 }

前端这里我引入了一个组件 js-file-download

npm install js-file-download --save

然后在Vue文件中添加进来

import fileDownload from "js-file-download";

 // 文档操作列对应事件
 async handleCommand(item, data) {
  switch (item.key) {
  case "download":
   var res = await this.download(data);
   return fileDownload(res, data.name);
  ...
  default:
  }
  // 刷新当前层级的列表
  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 注意需要设置responseType

/**
 * 下载单个文件
 * @param {*} id
 */
const download = (id) => {
 return request({
 url: _DataAPI.download + id,
 method: "GET",
 responseType: 'blob'
 });
};

这样即可成功下载。

关于vue.js的学习教程,请大家点击专题vue.js组件学习教程、Vue.js前端组件学习教程进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Vue.js 相关文章推荐
vue下拉刷新组件的开发及slot的使用详解
Dec 23 Vue.js
SpringBoot+Vue 前后端合并部署的配置方法
Dec 30 Vue.js
如何在vue中使用HTML 5 拖放API
Jan 14 Vue.js
vue使用过滤器格式化日期
Jan 20 Vue.js
vue实现禁止浏览器记住密码功能的示例代码
Feb 03 Vue.js
vue 数据双向绑定的实现方法
Mar 04 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
关于Vue Router的10条高级技巧总结
May 06 Vue.js
Vue详细的入门笔记
May 10 Vue.js
Vue+Element UI实现概要小弹窗的全过程
May 30 Vue.js
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
vue 自定义组件添加原生事件
Apr 21 Vue.js
vue+iview实现文件上传
Nov 17 #Vue.js
vue中echarts的用法及与elementui-select的协同绑定操作
Nov 17 #Vue.js
vue+iview实现分页及查询功能
Nov 17 #Vue.js
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 #Vue.js
vue+iview分页组件的封装
Nov 17 #Vue.js
在vue中通过render函数给子组件设置ref操作
Nov 17 #Vue.js
vue+vant实现购物车全选和反选功能
Nov 17 #Vue.js
You might like
php&java(二)
2006/10/09 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
使用php记录用户通过搜索引擎进网站的关键词
2014/02/13 PHP
PHP判断浏览器、判断语言代码分享
2015/03/05 PHP
php简单复制文件的方法
2016/05/09 PHP
Thinkphp实现站点静态化的方法详解
2017/03/21 PHP
JS类的封装及实现代码
2009/12/02 Javascript
Javascript学习笔记7 原型链的原理
2010/01/11 Javascript
jQuery动态设置form表单的enctype值(实现代码)
2013/07/04 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
Extjs中RowExpander控件的默认展开问题示例探讨
2014/01/24 Javascript
遍历DOM对象内的元素属性示例代码
2014/02/08 Javascript
JavaScript实现网页对象拖放功能的方法
2015/04/15 Javascript
纯JS实现可拖拽表单的简单实例
2016/09/02 Javascript
Jquery Easyui分割按钮组件SplitButton使用详解(17)
2016/12/18 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
NodeJS爬虫实例之糗事百科
2017/12/14 NodeJs
JavaScript通过mouseover()实现图片变大效果的示例
2017/12/20 Javascript
解决vue select当前value没有更新到vue对象属性的问题
2018/08/30 Javascript
viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)
2020/04/01 jQuery
基于Python3 逗号代码 和 字符图网格(详谈)
2017/06/22 Python
关于django 数据库迁移(migrate)应该知道的一些事
2018/05/27 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
Python持续监听文件变化代码实例
2020/07/22 Python
基于Python爬取股票数据过程详解
2020/10/21 Python
Python APScheduler执行使用方法详解
2020/12/10 Python
雅诗兰黛旗下专业男士保养领导品牌:Lab Series
2017/05/15 全球购物
区域总监的岗位职责
2013/11/21 职场文书
12岁生日感言
2014/01/21 职场文书
酒店管理毕业生自荐信
2014/05/25 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
关于召开会议的通知
2015/04/15 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
MySQL 隔离数据列和前缀索引的使用总结
2021/05/14 MySQL
bat批处理之字符串操作的实现
2022/03/16 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA