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打开其他项目页面并传入数据详解
Nov 25 Vue.js
VUE项目实现主题切换的多种方法
Nov 26 Vue.js
vue+element实现动态加载表单
Dec 13 Vue.js
vue 在服务器端直接修改请求的接口地址
Dec 19 Vue.js
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
Vue看了就会的8个小技巧
Jan 21 Vue.js
WebStorm无法正确识别Vue3组合式API的解决方案
Feb 18 Vue.js
vue3.0封装轮播图组件的步骤
Mar 04 Vue.js
vue项目实现分页效果
Mar 24 Vue.js
vue项目打包后路由错误的解决方法
Apr 13 Vue.js
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
Vue ECharts实现机舱座位选择展示功能
May 15 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
《五等分的花嫁》漫画完结!2020年10月第2期TV动画制作组换血!
2020/03/06 日漫
WAR3重制版DOTA 5V5初体验
2020/04/09 DOTA
PHP新手上路(十二)
2006/10/09 PHP
php5.2时间相差8小时
2007/01/15 PHP
解决thinkPHP 5 nginx 部署时,只跳转首页的问题
2019/10/16 PHP
JavaScript 浏览器验证代码(来自discuz)
2010/07/17 Javascript
js 创建快捷方式的代码(fso)
2010/11/19 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
原生javascript 学习之js变量全面了解
2016/07/14 Javascript
利用D3.js实现最简单的柱状图示例代码
2016/12/09 Javascript
js时间查询插件使用详解
2017/04/07 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
vue2.0的虚拟DOM渲染思路分析
2018/08/09 Javascript
解决Vue在封装了Axios后手动刷新页面拦截器无效的问题
2018/11/08 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
Vue 3.x+axios跨域方案的踩坑指南
2019/07/04 Javascript
LayUi使用switch开关,动态的去控制它是否被启用的方法
2019/09/21 Javascript
vue-model实现简易计算器
2020/08/17 Javascript
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Python环境下安装使用异步任务队列包Celery的基础教程
2016/05/07 Python
wxpython中Textctrl回车事件无效的解决方法
2016/07/21 Python
简单了解python中对象的取反运算符
2019/07/01 Python
python利用百度云接口实现车牌识别的示例
2020/02/21 Python
python属于跨平台语言码
2020/06/09 Python
Python实现列表索引批量删除的5种方法
2020/11/16 Python
Lands’ End官网:经典的美国生活方式品牌
2016/08/14 全球购物
美国从事品牌鞋类零售的连锁店:Famous Footwear
2016/08/25 全球购物
美国亚马逊旗下时尚女装网店:SHOPBOP(支持中文)
2020/10/17 全球购物
定义一结构体数组表示分数,并求两个分数相加之和
2013/06/11 面试题
幼儿教师求职信
2014/05/24 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
运动会班级前导词
2015/07/20 职场文书
初级职称评定工作总结
2015/08/13 职场文书
2016习总书记系列重要讲话心得体会
2016/01/15 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书