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 相关文章推荐
添加到收藏夹代码(兼容几乎所有的浏览器)
Jan 09 Javascript
jquery JSON的解析方式
Jul 25 Javascript
Jquery 表单取值赋值的一些基本操作
Oct 11 Javascript
Node.js实战 建立简单的Web服务器
Mar 08 Javascript
jquery validate poshytip 自定义样式
Nov 26 Javascript
javascript不同类型数据之间的运算的转换方法
Feb 13 Javascript
自定义百度分享的分享按钮
Mar 18 Javascript
使用vue.js编写蓝色拼图小游戏
Mar 17 Javascript
input框中自动展示当前日期yyyy/mm/dd的实现方法
Jul 06 Javascript
Nuxt升级2.0.0时出现的问题(小结)
Oct 08 Javascript
element-ui 实现响应式导航栏的示例代码
May 08 Javascript
vue如何使用模拟的json数据查看效果
Mar 31 Vue.js
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/23 PHP
nginx下安装php7+php5
2016/07/31 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
PHP调用接口API封装的例子
2019/10/11 PHP
laravel Task Scheduling(任务调度)在windows下的使用详解
2019/10/22 PHP
splice slice区别
2006/10/09 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
jquery实现盒子下拉效果示例代码
2013/09/12 Javascript
jQuery焦点图切换特效代码分享
2015/09/15 Javascript
总结JavaScript中布尔操作符||与&&的使用技巧
2015/11/17 Javascript
Angular 中 select指令用法详解
2016/09/29 Javascript
nodejs集成sqlite使用示例
2017/06/05 NodeJs
基于bootstrop常用类总结(推荐)
2017/09/11 Javascript
关于JavaScript语句后面的分号问题
2017/12/07 Javascript
vue项目中公用footer组件底部位置的适配问题
2018/05/10 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
JS无限级导航菜单实现方法
2019/01/05 Javascript
Vue.js实现的购物车功能详解
2019/01/27 Javascript
[07:57]2018DOTA2国际邀请赛寻真——PSG.LGD凤凰浴火
2018/08/12 DOTA
Python中方法链的使用方法
2016/02/23 Python
Pandas实现数据类型转换的一些小技巧汇总
2018/05/07 Python
python逆序打印各位数字的方法
2018/06/25 Python
Python爬虫框架scrapy实现downloader_middleware设置proxy代理功能示例
2018/08/04 Python
Django 实现图片上传和显示过程详解
2019/07/18 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
2019/08/19 Python
Python 支持向量机分类器的实现
2020/01/15 Python
opencv python如何实现图像二值化
2020/02/03 Python
Python新手学习raise用法
2020/06/03 Python
MADE法国:提供原创设计师家具
2018/09/18 全球购物
网络维护中文求职信
2014/01/03 职场文书
售后客服个人自我评价
2014/09/14 职场文书
大学教师个人总结
2015/02/10 职场文书
2015年教师工作总结范文
2015/03/31 职场文书
卫生保健工作总结2015
2015/05/18 职场文书
element tree树形组件回显数据问题解决
2022/08/14 Javascript