使用axios实现文件下载功能,通过Blob实现文件下载

517 阅读1分钟

1,js文件

// 文件导出
export const exportFileRequest = (url, params) => {
  return axios({
    method: 'get',
    url: `${base}${url}`, // 后端下载文件的接口
    params: params,
    responseType: 'blob', // 必须
    headers: { // 有的需要带上token等,可以写在这里,也可以封装起来
     // Authorization: getToken(),
    }
  });
};

2,html页面使用例子

<template>
  <div>
    <button v-on:click="download">下载文件</button>
  </div>
</template>

<script>
  // 引入需要使用的API
  import {exportExcel} from '@/api/index'
 
  export default {
    name: 'FileDownLoad',
    methods: {
      // 下载Excel
      download() {
        exportExcel().then(res => {
          console.log(res);
          this.downloadFile(res.data)
        })
      },
      downloadFile(data) {
        // 文件导出
        if (!data) {
          return
        }
        let url = window.URL.createObjectURL(new Blob([data]));
        let link = document.createElement('a');
        link.style.display = 'none';
        link.href = url;
        
        // link.setAttribute('download', '测试excel.xls'); // 文件名称
        link.setAttribute("download", decodeURI(res.headers['filename'])) // 解析文件名
        // 一般项目中,点击下载文件,那个就是文件名,如果后端没有返回headers这些内容,只返回了数据流,可以在点击的时候把name传进来,直接使用 
        document.body.appendChild(link);
        link.click()
         // 释放内存
     	 // window.URL.revokeObjectURL(link.href)
      }
    }
  }
</script>

3,一般点击下载,点击的就是文件名

<template>
  <div>
    <button v-on:click="download('测试.xlsx')">带后缀的某某文件(测试.xlsx)</button>
     <!-- 一般会有文件名,把文件名直接传入,下面就不用解析文件名了  -->
  </div>
</template>

<script>
  // 引入需要使用的API
  import {exportExcel} from '@/api/index'
 
  export default {
    name: 'FileDownLoad',
    methods: {
      // 下载Excel
      download(name) {
        exportExcel().then(res => {
          console.log(res);
          this.downloadFile(res.data, name)
        })
      },
      downloadFile(data, name) {
        // 文件导出
        if (!data) {
          return
        }
        let url = window.URL.createObjectURL(new Blob([data]));
        let link = document.createElement('a');
        link.style.display = 'none';
        link.href = url;
        link.setAttribute('download', name); // 文件名称
        // 一般项目中,点击下载文件,那个就是文件名,如果后端没有返回headers这些内容,只返回了数据流,可以在点击的时候把name传进来,直接使用 
        document.body.appendChild(link);
        link.click()
         // 释放内存
     	 // window.URL.revokeObjectURL(link.href)
      }
    }
  }
</script>

备注: 参考文档

例如: blog.csdn.net/weixin_3811…

blog.csdn.net/mobile18611…

www.cnblogs.com/lsqy/p/1144…