VueJS如何使用axios.post()或者axios.get()请求下载文件、音频、视频?并且显示下载进度,后端是SpringBoot

前端如何使用axios下载文件呢?最近遇到了前端下载音频及文件的功能,记录下,因为通过传统的window.location.href=xxx链接下载不能携带Token参数,后端无法验证请求放行,所以就用了axios。前端下载需要注意的是axios.interceptors.request的拦截器不要设置响应超时设置,不然由于网速慢,文件还没下载完就中断了。

下面是axios的HTTP请求的统一封装方法,数据接收使用了Blob对象:

    import axios from 'axios';

    let base = '/api';

    /**
     * 文件下载请求封装方法,POST请求
     *
     * @param this_ 外部this对象,用于更新下载进度
     * @param url 请求API
     * @param params 参数对象
     * @returns {Promise<AxiosResponse<T>>} Promise
     */
    downloadFileRequestPost: (this_, url, params) => {
        return axios.post(base + url, params, {
            responseType: 'blob',
            headers: {
                'Authorization': "Bearer " + window.sessionStorage.getItem('token')//设置token
            },
            onDownloadProgress: function (progressEvent) {//允许为下载处理进度事件
                this_.$nextTick(() => {//下载进度计算,这里使用Vuejs的$nextTick函数,请自行百度其作用
                    this_.downloadProgress = parseInt(100 * (progressEvent.loaded / progressEvent.total));
                });
            }
        });
    },
    
    /**
     * 文件下载请求封装方法,GET请求
     *
     * @param this_ 外部this对象,用于更新下载进度
     * @param url 请求API
     * @param params 参数对象
     * @returns {Promise<AxiosResponse<T>>} Promise
     */
    downloadFileRequestGet: (this_, url, params) => {
        return axios.get(base + url, {
            params: params,
            responseType: 'blob',
            headers: {
                'Authorization': "Bearer " + window.sessionStorage.getItem('token')//设置token
            },
            onDownloadProgress: function (progressEvent) {//允许为下载处理进度事件
                this_.$nextTick(() => {//下载进度计算,这里使用Vuejs的$nextTick函数,请自行百度其作用
                    this_.downloadProgress = parseInt(100 * (progressEvent.loaded / progressEvent.total));
                });
            }
        });
    }

以下是Vue组件页面的调用示例,HTML部分就不完整放出来了,进度条用了el-progress组件:

<template>
    <div>
        <el-row>
            <el-col :span="24">
                <el-form :inline="true" style="float: left;margin-top: 9px;">
                    <el-form-item>
                        <el-button v-if="downloadProgress===0||downloadProgress===100" type="success"
                                   @click="goDownBatch()" icon="el-icon-finished">批量打包下载
                        </el-button>
                        <el-progress type="circle" v-else
                                     :width="40" :percentage="downloadProgress" status="success"></el-progress>
                    </el-form-item>
                    <div v-if="downloadProgress===0||downloadProgress===100">
                        <el-button @click="downloadFile(scope.row)"
                                   type="text" size="small">下载
                        </el-button>
                    </div>
                    <el-progress type="circle" v-else :width="40" :percentage="downloadProgress" status="success"></el-progress>
                </el-form>
            </el-col>
        </el-row>
    </div&g
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

QC班长

班长有话说:要是有瓶水喝就好了

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值