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 相关文章推荐
用js实现的自定义的对话框的实现代码
Mar 21 Javascript
jquery.tmpl JQuery模板插件
Oct 10 Javascript
JavaScript 基础篇之运算符、语句(二)
Apr 07 Javascript
等待指定时间后自动跳转或关闭当前页面的js代码
Jul 09 Javascript
jquery 滚动条事件简单实例
Jul 12 Javascript
js处理json以及字符串的比较等常用操作
Sep 08 Javascript
jQuery Position方法使用和兼容性
Aug 23 jQuery
关于vue-router的beforeEach无限循环的问题解决
Sep 09 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
js实现多个倒计时并行 js拼团倒计时
Feb 25 Javascript
在Vue中使用HOC模式的实现
Aug 23 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时间戳 strtotime()使用方法和技巧
2013/10/29 PHP
PHP生成等比缩略图类和自定义函数分享
2014/06/25 PHP
PHP使用memcache缓存技术提高响应速度的方法
2014/12/26 PHP
php版微信js-sdk支付接口类用法示例
2016/10/12 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
关于PHP中interface的用处详解
2020/07/26 PHP
jquery自动填充勾选框即把勾选框打上true
2014/03/24 Javascript
JS不能跨域借助jquery获取IP地址的方法
2014/08/20 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
基于javascript、ajax、memcache和PHP实现的简易在线聊天室
2015/02/03 Javascript
JavaScript知识点总结(五)之Javascript中两个等于号(==)和三个等于号(===)的区别
2016/05/31 Javascript
浅谈JS中的bind方法与函数柯里化
2016/08/10 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
2016/09/20 Javascript
5分钟学会Vue动画效果(小结)
2018/07/21 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
eslint+prettier统一代码风格的实现方法
2020/07/22 Javascript
[04:22]DOTA2大事件之护国神翼
2020/08/14 DOTA
Python使用xlrd模块操作Excel数据导入的方法
2015/05/26 Python
python监控进程脚本
2018/04/12 Python
PYTHON基础-时间日期处理小结
2018/05/05 Python
python实现五子棋程序
2020/04/24 Python
Python run()函数和start()函数的比较和差别介绍
2020/05/03 Python
国际化的太阳镜及太阳镜配件零售商:Sunglass Hut
2016/07/26 全球购物
小学生班会演讲稿
2014/01/09 职场文书
《一个中国孩子的呼声》教学反思
2014/02/12 职场文书
酒店值班经理的工作职责范本
2014/02/18 职场文书
实习报告评语
2014/04/26 职场文书
物流管理系毕业生求职信
2014/06/03 职场文书
手术室护士节演讲稿
2014/08/27 职场文书
法人授权委托书样本
2014/09/19 职场文书
教育实习指导教师评语
2014/12/31 职场文书
新手必备之MySQL msi版本下载安装图文详细教程
2021/05/21 MySQL
在Python中如何使用yield
2021/06/07 Python
分享五个Node.js开发的优秀实践 
2022/04/07 NodeJs
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js