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 相关文章推荐
去除链接虚线全面分析总结
Aug 15 Javascript
extjs grid设置某列背景颜色和字体颜色的方法
Sep 03 Javascript
javascript 禁用IE工具栏,导航栏等等实现代码
Apr 01 Javascript
jQuery 中的 DOM 操作
Apr 26 Javascript
jquery实现图片切换代码
Oct 13 Javascript
浅析jQuery操作select控件的取值和设值
Dec 07 Javascript
Vue-cli中为单独页面设置背景色的实现方法
Feb 11 Javascript
详解开发react应用最好用的脚手架 create-react-app
Apr 24 Javascript
讲解vue-router之命名路由和命名视图
May 28 Javascript
React+Antd+Redux实现待办事件的方法
Mar 14 Javascript
VUE 单页面使用 echart 窗口变化时的用法
Jul 30 Javascript
详细聊聊浏览器是如何看闭包的
Nov 11 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实现zip压缩文件解压缩代码分享(简单易懂)
2014/05/10 PHP
php随机取mysql记录方法小结
2014/12/27 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
PHP下的浮点运算不准的解决方法
2016/10/27 PHP
javascript拓展DOM操作 prependChild insertAfert
2010/11/17 Javascript
浅谈Javascript中深复制
2014/12/01 Javascript
javaScript的函数对象的声明详解
2015/02/06 Javascript
JavaScript使用cookie实现记住账号密码功能
2015/04/27 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
微信小程序调用PHP后台接口 解析纯html文本
2017/06/13 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
vue组件间通信子与父详解(二)
2017/11/07 Javascript
解决vue打包css文件中背景图片的路径问题
2018/09/03 Javascript
JavaScript简单实现的仿微博留言功能示例
2019/01/17 Javascript
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
python抽取指定url页面的title方法
2018/05/11 Python
python删除字符串中指定字符的方法
2018/08/13 Python
对python捕获ctrl+c手工中断程序的两种方法详解
2018/12/26 Python
Python图像处理之gif动态图的解析与合成操作详解
2018/12/30 Python
python实现的Iou与Giou代码
2020/01/18 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
解析HTML5中的新功能本地存储localStorage
2016/03/01 HTML / CSS
Ajxa常见问题都有哪些
2014/03/26 面试题
毕业生找工作的自我评价
2013/10/18 职场文书
社会实践活动总结范文
2014/07/03 职场文书
作风整顿个人剖析材料
2014/10/06 职场文书
2015年幼儿园个人工作总结
2015/04/25 职场文书
2015年妇女工作总结
2015/05/14 职场文书
2016大学生形势与政策心得体会
2016/01/12 职场文书
spring boot项目application.properties文件存放及使用介绍
2021/06/30 Java/Android
Oracle安装TNS_ADMIN环境变量设置参考
2021/11/01 Oracle
Go语言读取txt文档的操作方法
2022/01/22 Golang
《月歌。》宣布制作10周年纪念剧场版《RABBITS KINGDOM THE MOVIE》
2022/04/02 日漫
vue @click.native 绑定原生点击事件
2022/04/22 Vue.js
volatile保证可见性及重排序方法
2022/08/05 Java/Android