后端返回文件流 前端处理方法

时间:2024-03-12 08:25:56

下载功能

一般后端会返回文件流的形式

前端会收到一堆乱码

前端需要对乱码进行转译  成正常的  

可以先创建一个公共的方法文件,这样就可以在项目的任何地方使用

utils.js

import { getToken } from \'@/common/utils/common/auth\';
import axios from \'axios\';
import { getLocalItem, Constants } from \'@/common/utils/common/cache\';
export function $fileDownload(url, config = {}) {
    let downloadUrl = process.env.VUE_APP_LIMS + url;
    let method = config.method || \'get\';
    axios
      .request({
        url: downloadUrl,
        method: method,
        headers: {
          Authorization: getToken(),
          \'Content-Type\': \'application/json\',
          \'User-Lang\': getLocalItem(Constants.LOCALE)
        },
        data: config.data,
        responseType: \'blob\'
      })
      .then(
        response => {
          console.log(response)
          let filename = response.headers[\'content-disposition\'];  // 取出文件名字
          console.log(filename)
          if (filename) {
            let index = filename.indexOf(\'fileName=\');
            console.log(index)
            if (index >= 0) {
              console.log(index)
              filename = filename.substr(index + 9);
              filename = decodeURI(filename);
            }
            console.log(index)
            filename = filename.substr(index + 21);
            filename = decodeURI(filename);
          }
          let fileDownload = require(\'js-file-download\');
          fileDownload(response.data, filename);
    
          if (typeof config.resolve === \'function\') {
            config.resolve();
          }

          
        
        },
        error => {
          let hasError = true;
          if (error.response) {
            const status = error.response.status;
            if (status === 401) {
              hasError = false;
            }
          }
          if (hasError) {
            this.$showError(\'下载出错,请稍后再试\');
          }
          if (typeof config.reject === \'function\') {
            config.reject();
          }
        }
      );
  }

 

页面使用

import { $fileDownload } from "@/modules/lims/utils/utils";
  async  tipsZPGCalendar() {

      // let data = {
      //     startDate: this.startDate,
      //     endDate: this.endDate,
      //   }
      // let config = {
      //   data: data,
      //   resolve: () => {
     
      //   },
      //   reject: () => {
    
      //   },
      // };
      let url = \'/capitalPlan/reportSearchZPGCalendar?startDate=\' + this.startDate + \'&endDate=\' + this.endDate
      const hh = await  $fileDownload(url)
    
     
    
      
    
    },

 

   handleClick() {
      let str = `参拍日期,项目名称\n`;
      for (let i = 0; i < this.list.length; i++) {
        let landProjects = [];
        for (let j = 0; j < this.list[i].landProjects.length; j++) {
          landProjects.push(this.list[i].landProjects[j]["projectName"]);
        }
        landProjects.join(",");
        str += `${this.list[i]["dateStr"]},${landProjects}`;
        str += "\n";
      }
      //encodeURIComponent解决中文乱码
      let uri = "data:text/csv;charset=utf-8,\ufeff" + encodeURIComponent(str);
      //通过创建a标签实现
      let link = document.createElement("a");
      link.href = uri;
      //对下载的文件命名
      link.download = `参拍日历数据表${this.year}-${this.month}.xls`;
      document.body.appendChild(link);
      link.click();
      document.body.removeChild(link);
    },

 

相关文章