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 相关文章推荐
一个不错的用JavaScript实现的UBB编码函数
Mar 09 Javascript
location.href语句与火狐不兼容的问题
Jul 04 Javascript
IE的事件传递-event.cancelBubble示例介绍
Jan 12 Javascript
一个JavaScript的求爱小特效
May 09 Javascript
js中的caller和callee属性介绍和例子
Jun 07 Javascript
分享几种比较简单实用的JavaScript tabel切换
Dec 31 Javascript
jQuery实现表格隔行及滑动,点击时变色的方法【测试可用】
Aug 20 Javascript
微信小程序 加载 app-service.js 错误解决方法
Oct 12 Javascript
jQuery手指滑动轮播效果
Dec 22 Javascript
基于JavaScript实现移动端无限加载分页
Mar 27 Javascript
jquery中attr、prop、data区别与用法分析
Sep 25 jQuery
原生JS封装拖动验证滑块的实现代码示例
Jun 01 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中防止SQL注入攻击和XSS攻击的两个简单方法
2010/04/15 PHP
phpinfo() 中 Local Value(局部变量)Master Value(主变量) 的区别
2016/02/03 PHP
Zend Framework入门教程之Zend_Session会话操作详解
2016/12/08 PHP
Laravel 实现Eloquent模型分组查询并返回每个分组的数量 groupBy()
2019/10/23 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
可恶的ie8提示缺少id未定义
2014/03/20 Javascript
jQuery获取页面元素绝对与相对位置的方法
2015/06/10 Javascript
学习JavaScript鼠标响应事件
2015/12/25 Javascript
jQuery+css实现非常漂亮的水平导航菜单效果
2016/07/27 Javascript
JavaScript String(字符串)对象的简单实例(推荐)
2016/08/31 Javascript
微信js-sdk上传与下载图片接口用法示例
2016/10/12 Javascript
学习vue.js条件渲染
2016/12/03 Javascript
详解JavaScript中return的用法
2017/05/08 Javascript
angularjs路由传值$routeParams详解
2020/09/05 Javascript
利用jqprint插件打印页面内容的实现方法
2018/01/09 Javascript
关闭Vue计算属性自带的缓存功能方法
2018/03/02 Javascript
jQuery插件simplePagination的使用方法示例
2020/04/28 jQuery
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
在Python中使用异步Socket编程性能测试
2014/06/25 Python
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Python argv用法详解
2016/01/08 Python
Python函数式编程
2017/07/20 Python
Python查找最长不包含重复字符的子字符串算法示例
2019/02/13 Python
瑜伽灵感珠宝:Satya Jewelry
2018/01/06 全球购物
Dillard’s百货官网:Dillards.com
2018/05/26 全球购物
罗兰·穆雷官网:Roland Mouret
2018/09/28 全球购物
高中毕业生自我鉴定范文
2013/09/26 职场文书
英语专业学子个人的自我评价
2013/10/02 职场文书
材料加工硕士生求职信
2013/10/10 职场文书
工艺工程师工作职责
2013/11/23 职场文书
计算机专业毕业生推荐信
2013/11/25 职场文书
2014年教研员工作总结
2014/12/23 职场文书
SpringBoot 拦截器妙用你真的了解吗
2021/07/01 Java/Android
Go语言应该什么情况使用指针
2021/07/25 Golang
Mysql案例刨析事务隔离级别
2021/09/25 MySQL
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技