vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)


Posted in Javascript onMay 10, 2019

vue-cli+axios实现附件上传下载记录:

上传:

这里用formData格式传递参数;请求成功后后台返回上传文件的对应信息。

重点是下载:

##############
downloadfile(res) {
var blob = new Blob([res.data], {type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8'}); //application/vnd.openxmlformats-officedocument.wordprocessingml.document这里表示doc类型
var contentDisposition = res.headers['content-disposition']; //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
var patt = new RegExp("filename=([^;]+\\.[^\\.;]+);*");
var result = patt.exec(contentDisposition);
var filename = result[1];
var downloadElement = document.createElement('a');
var href = window.URL.createObjectURL(blob); //创建下载的链接
var reg = /^["](.*)["]$/g;
downloadElement.style.display = 'none';
downloadElement.href = href;
downloadElement.download = decodeURI(filename.replace(reg,"$1")); //下载后文件名
document.body.appendChild(downloadElement);
downloadElement.click(); //点击下载
document.body.removeChild(downloadElement); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放掉blob对象
}
##########################

使用blob接收文件流,中间var reg = /^["](.*)["]$/g;为了解决下载的文件前后有_问题,把两侧的" "去掉可正常显示;

decodeURI():对后台返回的中文文件名url编码进行转码

PS:下面看下VUE+axios上传文件,下载文件中的一个坑。

问题描述:最近一个项目中使用axios进行上传和下载,但是上传和下载是需要定义responseType和headers的,这样问题就出来了当你没有权限时候这个接口是抛出一个json数据的,同样上传格式错误也是一个json数据的;由于已经定义了responseType所以接到的数据是已经被转换的数据,它同样会进行下载这时候就需要我们判断返回数据时候的headers是否为文件以外的定义,然后将blob数据转化为json数据即可。代码如下

下载文件为例:

let requsetFile = (params,baseurl,url) =>{
 axios({
  method: 'get',
  baseURL:baseurl,
  url: url,
  headers: {'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'}, //定义相应头
  responseType: 'blob',  //定义
  data:params.query || {}
 })
  .then(function(res){
   params.success && params.success(res)
  })
  .catch(function(error){
   params.error && params.error(error)
  })
}
//下面为判断headers和转化blob为json
api.Templet({
      success:res=>{
       const isEXCLE = res.headers["content-type"] === ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" || "application/vnd.ms-excel");
       if(!isEXCLE){
        let reader = new FileReader();
        reader.onload = e => this.$message.error(JSON.parse(e.target.result).msg);
        reader.readAsText(res.data);
       }else {
        let blob = new Blob([res.data], {type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"});
        const fileName = `模板文件${Date.parse(new Date())}.xlsx`;
        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 对象
         document.body.removeChild(elink);
        } else { // IE10+下载
         navigator.msSaveBlob(blob, fileName);
        }
       }
      }
     })

总结

以上所述是小编给大家介绍的vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流),希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
基于jquery的获取mouse坐标插件的实现代码
Apr 01 Javascript
JQuery 应用 JQuery.groupTable.js
Dec 15 Javascript
JavaScript基础语法让人疑惑的地方小结
May 23 Javascript
javascript实现简单的二级联动
Mar 19 Javascript
学习javascript文件加载优化
Feb 19 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
荐书|您有一份JavaScript书单待签收
Jul 21 Javascript
vue2 mint-ui loadmore实现下拉刷新,上拉更多功能
Mar 21 Javascript
JavaScript解析及序列化JSON的方法实例分析
Jan 04 Javascript
vue踩坑记-在项目中安装依赖模块npm install报错
Apr 02 Javascript
使用原生js编写一个简单的框选功能方法
May 13 Javascript
JS实现的进制转换,浮点数相加,数字判断操作示例
Nov 09 Javascript
vue element中axios下载文件(后端Python)
May 10 #Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
May 10 #Javascript
简单通过settimeout看javascript的运行机制
May 10 #Javascript
详解js实时获取并显示当前时间的方法
May 10 #Javascript
JS获取本地地址及天气的方法实例小结
May 10 #Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
May 10 #Javascript
vue无限轮播插件代码实例
May 10 #Javascript
You might like
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
PHP冒泡算法详解(递归实现)
2014/11/10 PHP
一段实时更新的时间代码
2006/07/07 Javascript
greybox——不开新窗口看新的网页
2007/02/20 Javascript
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
JQuery 动态扩展对象之另类视角
2010/05/25 Javascript
让复选框只能选择一项的方法
2013/10/08 Javascript
JQuery插件fancybox无法在弹出层使用左右键的解决办法
2013/12/25 Javascript
jquery实现的蓝色二级导航条效果代码
2015/08/24 Javascript
JS库中的Particles.js在vue上的运用案例分析
2017/09/13 Javascript
使用Angular CLI生成路由的方法
2018/03/24 Javascript
[47:42]完美世界DOTA2联赛PWL S2 GXR vs Ink 第一场 11.19
2020/11/20 DOTA
Python中的rjust()方法使用详解
2015/05/19 Python
Python数组定义方法
2016/04/13 Python
Python正则表达式分组概念与用法详解
2017/06/24 Python
对python3 中方法各种参数和返回值详解
2018/12/15 Python
python单例模式的多种实现方法
2019/07/26 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
关于Tensorflow 模型持久化详解
2020/02/12 Python
解决pycharm下pyuic工具使用的问题
2020/04/08 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
Scrapy爬虫文件批量运行的实现
2020/09/30 Python
scrapy redis配置文件setting参数详解
2020/11/18 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
Fresh馥蕾诗英国官网:法国LVMH集团旗下高端天然护肤品牌
2018/11/01 全球购物
RealTek面试题
2016/06/28 面试题
什么是.net的Remoting技术
2016/07/08 面试题
班级安全教育实施方案
2014/02/23 职场文书
高三霸气励志标语
2014/06/24 职场文书
综治维稳工作承诺书
2014/08/30 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
2014年远程教育工作总结
2014/12/09 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
2016年保险公众宣传日活动总结
2016/04/05 职场文书
PHP实现rar解压读取扩展包小结
2021/06/03 PHP
Pytorch反向传播中的细节-计算梯度时的默认累加操作
2021/06/05 Python