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 相关文章推荐
filemanage功能中用到的common.js
Apr 08 Javascript
25个优雅的jQuery Tooltip插件推荐
May 25 Javascript
html5的自定义data-*属性和jquery的data()方法的使用示例
Aug 21 Javascript
JS实现从表格中动态删除指定行的方法
Mar 31 Javascript
Bootstrap路径导航与分页学习使用
Feb 08 Javascript
jQuery实现文档树效果
Feb 20 Javascript
vue 中自定义指令改变data中的值
Jun 02 Javascript
jQuery实现轮播图及其原理详解
Apr 12 jQuery
js之切换全屏和退出全屏实现代码实例
Sep 09 Javascript
layui使用templet格式化表格数据的方法
Sep 16 Javascript
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
Vue 如何使用props、emit实现自定义双向绑定的实现
Jun 05 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中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
php抓取并保存网站图片的实现代码
2015/10/28 PHP
PHP环境中Memcache的安装和使用
2015/11/05 PHP
万能的php分页类
2017/07/06 PHP
PHP单例模式实例分析【防继承,防克隆操作】
2019/05/22 PHP
使用Entrust扩展包在laravel 中实现RBAC的功能
2020/03/16 PHP
JavaScript的Function详细
2006/11/14 Javascript
jQuery基础框架浅入剖析
2012/12/27 Javascript
JavaScript限定复选框的选择个数示例代码
2013/08/25 Javascript
js实现连个数字相加而不是拼接的方法
2014/02/23 Javascript
jQuery多媒体插件jQuery Media Plugin使用详解
2014/12/19 Javascript
sencha ext js 6 快速入门(必看)
2016/06/01 Javascript
js控制文本框只能输入中文、英文、数字与指定特殊符号的实现代码
2016/09/09 Javascript
js中作用域的实例解析
2017/03/16 Javascript
Angular实现一个简单的多选复选框的弹出框指令实例
2017/04/25 Javascript
Vue通过input筛选数据
2020/10/26 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
H5基于iScroll实现下拉刷新和上拉加载更多
2017/07/18 Javascript
JS实现点击复选框变更DIV显示状态的示例代码
2017/12/18 Javascript
vue、react等单页面项目部署到服务器的方法及vue和react的区别
2018/09/29 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
搭建Vue从Vue-cli到router路由护卫的实现
2019/11/14 Javascript
在Webpack中用url-loader处理图片和字体的问题
2020/04/28 Javascript
[19:54]夜魇凡尔赛茶话会 第一期02:看图识人
2021/03/11 DOTA
高性能web服务器框架Tornado简单实现restful接口及开发实例
2014/07/16 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
python定位xpath 节点位置的方法
2019/08/27 Python
Python日期格式和字符串格式相互转换的方法
2020/02/18 Python
详解KMP算法以及python如何实现
2020/09/18 Python
金鑫耀Java笔试题
2014/09/06 面试题
七年级政治教学反思
2014/02/03 职场文书
《老王》教学反思
2014/02/23 职场文书
党员创先争优心得体会
2014/09/11 职场文书
汇报材料怎么写
2014/12/30 职场文书
英文慰问信
2015/02/14 职场文书
Nginx实现负载均衡的项目实践
2022/03/18 Servers