vue使用axios实现下载文件功能

项目采用前后端分离策略搭建,后端使用SpringBoot+SpringMVC,前端使用vue+elementui,采用restful风格进行数据传输,此篇文章不介绍后端代码

首先封装导出数据api

新建一个文件,文件中放的是所有的接口信息,api写法和其他的并无异处,只是多了一个responseType

import http from '@/axios';

/**
 * 查询作业队上报的表单列表
 * @param params 查询条件
 * @return
 */
export function findTeamReportList(params){
  return http.get(`/form/report`,{params:params});
}

/**
 * 导出表单数据
 * @param formType 表单类型
 * @param formId 表单id
 */
export function exportFormData(formType,formId){
  return http.get(`/form/export/${formType}/${formId}`,{responseType:'blob'});
}

写一个解析返回数据的方法

由于项目中很多地方都用到了下载文件功能,所以将方法写成一个公共的,使用时候调用就可以了,在main.js添加方法

Vue.prototype.getFileFromResponse = function (response) {
    try {
        let disposition = response.headers['content-disposition'];//获取content-disposition
        let fileInfo = disposition ? disposition.substr(disposition.indexOf('filename')) : '';
        let fileName= fileInfo?fileInfo.split('=')[1]:'';
        if(!fileName.substr(fileName.indexOf('.'))) {
            this.$notify({
                title: '提示',
                message: '暂时没有您想要的数据',
                type: 'error'
            });
            return;
        }
        //处理二进制流文件
        var blob = new Blob([response.data], {type: 'application/x-download;charset=utf-8'}); 
        var downloadElement = document.createElement('a');
        var href = window.URL.createObjectURL(blob); //创建下载的链接
        downloadElement.href = href;
        downloadElement.download = decodeURIComponent(fileName.replace(/\"/g,'')); //下载后文件名
        document.body.appendChild(downloadElement);
        downloadElement.click(); //点击下载
        document.body.removeChild(downloadElement); //下载完成移除元素
        window.URL.revokeObjectURL(href); //释放掉blob对象
    }catch (e) {
        throw e;
    }
};

点击按钮导出数据

点击导出按钮后,调用方法导出数据,下面代码中的formAPI是引用的最开始的api文件

//导出表单数据
      exportForm(row) {
        let formType=row.type;
        let formTypeFormatted=formType==='parkType-1' ? 'culture' : formType === 'parkType-2' ? 'visitor' : 'flower';

        formAPI.exportFormData(formTypeFormatted,row.id).then(response => {
          this.getFileFromResponse(response);
        }).catch(err => {
          this.$notify({
            title: this.$t('msg.title'),
            message: this.getErr(err),
            type: 'error',
            duration: 2000
          })
        })
      }

通过api方法发送到后台后,后台处理完毕将返回的response信息通过方法处理后就会开始下载文件

可以看到二进制流文件已经正确返回,这时文件也已经下载完毕

该方法出现的问题

这种方法虽然可以实现带登录信息下载文件的需求,但是当使用手机浏览器进行下载的时候会出现无法下载的情况,目前本人并不知道如何解决手机下载的问题,好在我们项目没有手机浏览下载的要求,如果有此需求的coder请酌情使用,如果有解决方法也请留言告知一下

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue使用Axios进行文件下载可以通过以下步骤实现: 1. 首先,你需要在Vue项目中安装并引入Axios库。 2. 在需要下载文件的组件中,导入Axios库,并调用Axios的get方法发送请求。 3. 在请求中通过设置`responseType`参数为`'blob'`来告诉服务器返回的是二进制数据流,而不是JSON或文本数据。 4. 在请求成功的回调函数中,将服务器返回的二进制数据转换为Blob对象。 5. 创建一个URL对象,将Blob对象转换为可下载的URL地址。 6. 创建一个a标签元素,并设置其href属性为下载的URL地址,设置其download属性为文件名。 7. 使用JavaScript模拟点击a标签,实现文件下载。 下面是一个使用Axios进行文件下载的示例代码: ```javascript import axios from 'axios'; export default { methods: { downloadFile() { axios({ url: 'your_file_url', method: 'GET', responseType: 'blob' // 告诉服务器返回的是二进制数据流 }) .then((response) => { const blob = new Blob([response.data]); // 将二进制数据转换为Blob对象 const url = URL.createObjectURL(blob); // 创建可下载的URL地址 const link = document.createElement('a'); // 创建a标签元素 link.href = url; // 设置a标签的href属性为下载的URL地址 link.download = 'file_name'; // 设置a标签的download属性为文件名 link.click(); // 模拟点击a标签进行下载 URL.revokeObjectURL(url); // 释放URL对象 }) .catch((error) => { console.error(error); }); } } }; ``` 在上面的示例中,你需要将`your_file_url`替换为你要下载文件的URL地址,将`file_name`替换为你要保存的文件名。 这样就可以使用AxiosVue中进行文件下载了。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Vue系列5 - Vue+axios实现文件下载](https://blog.csdn.net/bitree1/article/details/101217861)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [vue使用axios下载文件](https://blog.csdn.net/qq_43892230/article/details/129811949)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值