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添加String.Format方法
Aug 11 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
Dec 14 Javascript
jQuery UI 应用不同Theme的办法
Sep 12 Javascript
javascript 学习笔记(六)浏览器类型及版本信息检测代码
Apr 08 Javascript
jQuery实现仿微软首页感应鼠标变化滑动窗口效果
Oct 08 Javascript
常用Javascript函数与原型功能收藏(必看篇)
Oct 09 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
通过vue-cli来学习修改Webpack多环境配置和发布问题
Dec 22 Javascript
vue实现树形菜单效果
Mar 19 Javascript
Vue动态获取width的方法
Aug 22 Javascript
Servlet返回的数据js解析2种方法
Dec 12 Javascript
javascript实现左右缓动动画函数
Nov 25 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代码飞起来的40条小技巧(提升php效率)
2010/04/12 PHP
php join函数应用
2011/05/04 PHP
可以保证单词完整性的PHP英文字符串截取代码分享
2014/07/15 PHP
ThinkPHP实现非标准名称数据表快速创建模型的方法
2014/11/29 PHP
PHP实现抓取HTTPS内容
2014/12/01 PHP
php生成唯一数字id的方法汇总
2015/11/18 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
php微信开发之音乐回复功能
2018/06/14 PHP
使用jQuery全局事件ajaxStart为特定请求实现提示效果的代码
2010/12/30 Javascript
原生Js实现简易烟花爆炸效果的方法
2015/03/20 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
浅谈js和css内联外联注意事项
2016/06/30 Javascript
js实现消息滚动效果
2017/01/18 Javascript
JQuery实现图片轮播效果
2017/05/08 jQuery
Vue 的双向绑定原理与用法揭秘
2020/05/06 Javascript
[02:26]DOTA2英雄米拉娜基础教程
2013/11/25 DOTA
[43:24]VG vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python获取电脑硬件信息及状态的实现方法
2014/08/29 Python
利用numpy实现一、二维数组的拼接简单代码示例
2017/12/15 Python
Python+树莓派+YOLO打造一款人工智能照相机
2018/01/02 Python
python如何获取当前文件夹下所有文件名详解
2019/01/25 Python
Django中间件基础用法详解
2019/07/18 Python
twilio python自动拨打电话,播放自定义mp3音频的方法
2019/08/08 Python
Tensorflow限制CPU个数实例
2020/02/06 Python
Python进程Multiprocessing模块原理解析
2020/02/28 Python
Python常驻任务实现接收外界参数代码解析
2020/07/21 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
移动Web—CSS为Retina屏幕替换更高质量的图片
2012/12/24 HTML / CSS
Otel.com:折扣酒店预订
2017/08/24 全球购物
数学兴趣小组活动总结
2014/07/08 职场文书
党支部承诺书
2015/01/20 职场文书
抢劫罪辩护词
2015/05/21 职场文书
2016暑期社会实践新闻稿
2015/11/25 职场文书
前端学习——JavaScript原生实现购物车案例
2021/03/31 Javascript
SpringBoot生成License的实现示例
2021/06/16 Java/Android