后端返回base64文件前端如何下载

1.后端返回base64格式文件
在这里插入图片描述

2.前端代码

<style lang="less" scoped>
@import "./style/common.less";

.table-div-a {
  color: #409EFF;
  text-decoration: underline;
  cursor: pointer;
}
</style>

<template>
  <div class="template-container content-container" v-loading="pageObj.loading">
    <div class="action-button-div flex-div">
      <div class="action-button-div-left flex-1">
        <el-button class="main-cust-btn" type="primary" size="small" @click="initList()">刷新</el-button>
      </div>
      <div class="action-button-div-right  flex-div">
        <el-select v-model="pageObj.pageParmas.exportType" placeholder="请选择导出类型" @change="selectVal">
          <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value">
          </el-option>
        </el-select>
        <!-- <div class="single-query-input margin-right-8">
          <el-input size="small" placeholder="请输入角色名" v-model="pageObj.queryParams.roleName"></el-input>
        </div>
        <el-button-group>
          <el-button class="main-cust-btn" size="small" type="primary" icon="el-icon-search" @click="initList('query')">查询</el-button>
        </el-button-group> -->
      </div>
    </div>
    <!--表格区-->
    <div class="table-div flex-div">
      <el-table :data="pageObj.tableData" :stripe="true" ref="listTableRef" border class="flex-1 list-table"
        header-row-class-name="list-table-header">
        <el-table-column type="index" width="40" align="center">
        </el-table-column>
        <el-table-column prop="startTime" label="下载时间" min-width="150" align="center">
        </el-table-column>
        <el-table-column prop="exportTypeName" label="导出类型" min-width="150" align="center">
        </el-table-column>
        <el-table-column prop="operationalName" label="状态" min-width="150" align="center">
        </el-table-column>
        <el-table-column prop="endTime" label="完成时间" min-width="120" align="center">
        </el-table-column>
        <el-table-column label="操作" align="center" width="180" fixed="right">
          <div slot-scope="scope">
            <a class="table-div-a" v-if="'计算完成' == scope.row.operationalName" @click="toExportPath(scope.row)">下载</a>
          </div>
        </el-table-column>
      </el-table>
    </div>
    <!--分页区-->
    <div class="pagination-div">
      <el-pagination v-show="pageObj.pageParmas.total > 0" :current-page="pageObj.pageParmas.pageNum + 1"
        :page-sizes="pageObj.Config.paginationParams.pageSizes" :page-size="pageObj.pageParmas.pageSize"
        :layout="pageObj.Config.paginationParams.layout" :total="pageObj.pageParmas.total" @size-change="handleSizeChange"
        @current-change="handlePageChange">
      </el-pagination>
    </div>
    <!--确认删除对话框-->
    <!-- <del-dialog
      :delDialogVisible="deleteObj.delDialogVisible"
      v-on:doDel="delOne"
      v-on:cancelDel="
        () => {
          deleteObj.delDialogVisible = false;
        }
      "
    ></del-dialog> -->
  </div>
</template>

<script>
// 删除组件
// import delDialog from "../../components/list/DelDialog.vue";
import config from "./config.js";
export default {
  components: {
    // delDialog
  },
  data() {
    return {
      pageObj: {
        // 页面属性
        showSearch: true, // 高级搜索展示
        detailRouter: "roleDetail", // 详情页路由
        loading: false, // 加载
        tableData: [],
        queryParams: {},
        pageParmas: {
          pageNum: 0,
          pageSize: 10,
          exportType: ''//2 结算导出 3 订单导出
        },
        Config: config
      },
      deleteObj: {
        // 删除对话框 属性
        delDialogVisible: false, // 是否显示删除对话框
        delOneId: "" // 删除单个ID
      },
      listLooper: null,
      options: [{
        value: 2,
        label: '结算导出'
      }, {
        value: 3,
        label: '订单导出'
      }]
    };
  },
  methods: {
    init() {
      if (Object.keys(this.$route.query).length > 0) {//从订单和结算页面带值过来
        this.pageObj.pageParmas.exportType = this.$route.query.type;
        console.log(this.pageObj.pageParmas.exportType)
      }
      // 初始化面包屑
      this.$store.commit("setBreadCrumbList", [
        { type: 'title', name: '主数据' },
        { type: 'title', name: '下载中心' }
      ]);
      this.initList();
    },
    // 跳转新增页面
    toAdd() {
      var _ = this;
      this.$store.commit("setEditId", "");
      this.$router.push({
        name: _.pageObj.detailRouter
      });
    },
    // 跳转编辑页
    toEdit(objId) {
      var _ = this;
      this.$store.commit("setEditId", objId);
      this.$router.push({
        name: _.pageObj.detailRouter
      });
    },
    // 展示删除对话框
    toDelOne(objId) {
      this.deleteObj.delOneId = objId;
      this.deleteObj.delDialogVisible = true;
    },
    // 删除一个
    delOne() {
      let _ = this;
      const url = this.$A.role + "/" + this.deleteObj.delOneId;
      _.$H.delete(_, url, function () {
        // TODO
        _.deleteObj.delDialogVisible = false;
        _.$U.success(_, "删除成功!");
        _.initList();
      });
    },
    selectVal() {
      this.pageObj.pageParmas.pageNum = 0;
      this.initList();
    },
    // 初始化列表
    initList() {
      let _ = this;
      clearTimeout(_.listLooper);
      this.pageObj.loading = true;
      // if (this.$U.notEmpty(type)) {
      //   this.pageObj.pageParmas.pageNum = 0;
      // }
      // 初始化查询参数
      this.initQueryParams();
      // TODO
      // _.$H.get(_, _.$A.download.list, _.pageObj.queryParams, function (res) {
      //   _.pageObj.tableData = res.data.data.content;
      //   if (
      //     _.pageObj.tableData.length === 0 &&
      //     _.pageObj.pageParmas.pageNum > 0
      //   ) {
      //     _.pageObj.pageParmas.pageNum--;
      //     _.initList();
      //   } else {
      //     _.pageObj.pageParmas.total = res.data.data.totalElements;
      //     _.pageObj.loading = false;

      //     _.listLooper = setTimeout(() => {
      //       _.initList();
      //     }, 30000);
      //   }
      // });
      _.$H.get(_, _.$A.download.list, _.pageObj.queryParams).then(res => {
        _.pageObj.tableData = res.data.data.content;
        if (
          _.pageObj.tableData.length === 0 &&
          _.pageObj.pageParmas.pageNum > 0
        ) {
          _.pageObj.pageParmas.pageNum--;
          _.initList();
        } else {
          _.pageObj.pageParmas.total = res.data.data.totalElements;
          _.pageObj.loading = false;

          // _.listLooper = setTimeout(() => {
          //   _.initList();
          // }, 30000);
        }

      }).catch(err => {

      })
    },
    // 初始化查询参数
    initQueryParams() {
      this.pageObj.queryParams.pageNum = this.pageObj.pageParmas.pageNum || 0;
      this.pageObj.queryParams.pageSize = this.pageObj.pageParmas.pageSize || 10;
      this.pageObj.queryParams.exportType = this.pageObj.pageParmas.exportType || '';
    },
    // 条数变更
    handleSizeChange(val) {
      this.pageObj.pageParmas.pageSize = val;
      this.initList();
    },
    // 页码变更
    handlePageChange(val) {
      this.pageObj.pageParmas.pageNum = val - 1;
      this.initList();
    },
    typeFormat(row, key, value) {
      var typeName = "";
      if (value == "01") {
        typeName = "安装订单导出";
      } else if (value == "02") {
        typeName = "配送订单导出";
      } else if (value == "04") {
        typeName = "结算导出";
      } else if (value == "09") {
        typeName = "补贴订单导出";
      } else if (value == "012") {
        typeName = "退回订单记录导出";
      } else if (value == "03") {
        typeName = "作废订单导出";
      } else if (value == "06") {
        typeName = "报修订单导出";
      } else if (value == "011") {
        typeName = "投诉订单导出";
      } else if (value == "013") {
        typeName = "不送桩VIN导出";
      }
      return typeName;
    },
    statusFormat(row, key, value) {
      var statusName = "";
      if (value == 0) {
        statusName = "等待中";
      }
      if (value == 1) {
        statusName = "进行中";
      } else if (value == 2) {
        statusName = "已完成";
      } else if (value == 5) {
        statusName = "失败";
      }
      return statusName;
    },
    downloadFile: function (blob, fileName) {
      const link = document.createElement("a");
      link.href = window.URL.createObjectURL(blob);
      link.download = fileName;
      // 此写法兼容可火狐浏览器
      document.body.appendChild(link);
      const evt = document.createEvent("MouseEvents");
      evt.initEvent("click", false, false);
      link.dispatchEvent(evt);
      document.body.removeChild(link);
    },
    // 将Base64文件转为 Blob
    buildBlobByByte: function (data) {
      const raw = window.atob(data);
      const rawLength = raw.length;
      const uInt8Array = new Uint8Array(rawLength);
      for (let i = 0; i < rawLength; ++i) {
        uInt8Array[i] = raw.charCodeAt(i);
      }
      return new Blob([uInt8Array]);
    },
    // 二进制数组 生成文件
    downloadFileByByte: function (data, fileName) {
      const blob = this.buildBlobByByte(data);
      this.downloadFile(blob, fileName);
    },
    // 下载
    toExportPath(obj) {
      let _ = this;
      this.pageObj.loading = true;

      // _.$H.getBlob(
      //   _,
      //   _.$A.exportListDownload + "/" + obj.id,
      //   {},
      //   function (res) {
      // const fileName = _.typeFormat("", "", obj.type);
      // //数据转换为文件下载
      // var elink = document.createElement("a");
      // elink.download = fileName;
      // elink.style.display = "none";
      // var blob = new Blob([res.data]);
      // const reader = new FileReader();
      // reader.readAsText(blob); // 以文本形式读取Blob对象
      // reader.onload = () => {
      //   const jsonStr = reader.result; // 获取读取的内容
      //   const jsonData = JSON.parse(jsonStr); // 将JSON格式的字符串转换为JavaScript对象

      //   const fileBase64 = jsonData.data.base64;

      //   _.downloadFileByByte(fileBase64, fileName + ".xlsx");
      // };

      // _.pageObj.loading = false;
      //   }
      // );
      _.$H.getBlob(_, _.$A.download.export, {
        id: obj.id,
        exportType: obj.exportType
      }).then(res => {
        console.log(res.data)
        // const fileName = _.typeFormat("", "", obj.type);
        const fileName =  obj.exportTypeName +  Date.now();
        //数据转换为文件下载
        var elink = document.createElement("a");
        elink.download = fileName;
        elink.style.display = "none";
        var blob = new Blob([res.data]);
        const reader = new FileReader();
        reader.readAsText(blob); // 以文本形式读取Blob对象
        reader.onload = () => {
          const jsonStr = reader.result; // 获取读取的内容
          const jsonData = JSON.parse(jsonStr); // 将JSON格式的字符串转换为JavaScript对象

          const fileBase64 = jsonData.data.base64;

          _.downloadFileByByte(fileBase64, fileName + ".xlsx");
        };

        _.pageObj.loading = false;
      }).catch(err => {

      })
    }
  },
  mounted() {
    this.init();
  },
  beforeDestroy() {
    clearTimeout(this.listLooper);
  }
};
</script>

3.请求封装

// get 请求
http.getBlob = function (vm, url, params) {
    return new Promise((resolve, reject) => {
        axios
            .get(url, {
                params: params || {},
                headers: {
                    'Content-Type': 'application/json;charset=UTF-8',
                    authorization: vm.$store.state.token,
                    responseType: 'blob'
                },
                timeout: config.httpTimeOut,
                responseType: 'blob'
            })
            .then(res => {
                resolve(res)
            })
            .catch(err => {
                custErrFun(vm, err)
            })
    })
}
// postBlob 请求
http.postBlob = function (vm, url, params) {
    return new Promise((resolve, reject) => {
        axios
            .post(url, params, {
                headers: {
                    'Content-Type': 'application/json;charset=UTF-8',
                    authorization: vm.$store.state.token,
                    responseType: 'blob'
                },
                timeout: config.httpTimeOut,
                responseType: 'blob'
            })
            .then(res => {
                custResponseFun(vm, res, resolve)
            })
            .catch(err => {
                custErrFun(vm, err)
            })
    })
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/229978.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WPF仿网易云搭建笔记(1):项目搭建

文章目录 前言项目地址动态样式组合样式批量样式覆盖Prism新建UserControler修改Material Design 笔刷收放列表可以滚动的StackPanel列表点击展开或折叠 实现效果 前言 今天接着继续细化代码&#xff0c;把整体框架写出来 项目地址 WPF仿网易云 Gitee仓库 动态样式 【WPF】C#…

使用Pytorch实现Grad-CAM并绘制热力图

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 看一下这个main cnn.py的文件 那这里我为了方便 就直接从官方的torch vision这个库当中导入一些我们常用的model 比如说我这里的例子是采用的mobile net v3 large这个模型 然后这里我将pretrain设…

融合科技,升级医疗体验——医院陪诊服务的技术创新

随着科技的迅猛发展&#xff0c;医疗服务领域也在积极借助技术手段提升患者体验。本文将探讨如何利用先进的技术代码&#xff0c;将医院陪诊服务推向新的高度。 1. 医疗预约系统的实现 # 通过Python代码实现医疗预约系统 class MedicalAppointment:def __init__(self, patie…

持续集成交付CICD:使用Maven命令下载Nexus制品

目录 一、实验 1.Maven安装 2.Nexus搭建公共组仓库及Maven全局配置文件 3.使用Maven命令下载Nexus制品 一、实验 1.Maven安装 &#xff08;1&#xff09;CentOS环境安装步骤 tar -xf apache-maven-3.8.6-bin.tar.gz #解压 mv apache-maven-3.8.6 /usr/local/maven #移动…

django与数据库交互关于当前时间的坑

背景 在线上服务中使用时间进行数据库操作时发现异常&#xff0c;而在本地环境无法成功复现此问题&#xff0c;导致难以进行故障排查。 核心问题 view.py class XxxViewSet(viewsets.ModelViewSet):queryset Xxx.objects.with_status().order_by("status", &quo…

集简云 x 零售企业丨快速集成有赞商城和微盛企微管家,实现私域运营自动化

客户介绍 某公司是一家知名的饮料厂商&#xff0c;自1998年成立以来&#xff0c;一直致力于研发和生产各种热门饮品&#xff0c;如果汁、碳酸饮料、矿泉水等。因其独特的口感和健康的品质深受消费者的喜爱。企业拥有多个知名品牌&#xff0c;享有极高的品牌知名度和市场份额。该…

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…

P4 Qt如何添加qss样式表文件和添加图片资源

目录 前言 01 添加图片资源文件 02 添加qss文件 前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Qt基础_ChenPi的博客-CSDN博客》✨✨✨ &#x1f33a;本篇简介 &#xff1a;这一章…

华为OD机试 - 生成哈夫曼树(Java JS Python C)

题目描述 给定长度为 n 的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。 请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。 为了保证输出的二叉树中序遍历结果统一,增加以下限制: 二叉树节点中,左节…

【后端学前端学习记录】第一天 css动画 内凹导航栏

1、学习信息 css动画 内凹导航栏_哔哩哔哩_bilibili 随便找的的视频&#xff0c;主要原因是在公司不方便有声音 2、源码 最终源码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title…

案例064:基于微信小程序的考研论坛设计

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

【git push ERROR: commit id: missing Change-Id in message footer】

使用 gerrit 后&#xff0c;提交代码会出现如下截图问题&#xff1a; 临时解决&#xff1a; step1: 把上面红色的那条gitidir复制下来执行下&#xff1a; step2:执行下面的命令会添加change_id git commit --amendstep3: 然后推送代码到服务器上 git push origin HEAD:refs/fo…

openlayers地图使用---跟随地图比例尺动态标绘大小的一种方式3

openlayers地图使用—跟随地图比例尺动态标绘大小的一种方式 预期&#xff1a;随着地图比例尺放大缩小&#xff0c;地图上的标绘随着变化尺寸 思路&#xff1a;通过VectorImage和动态修改Feature尺寸实现Feature跟随地图比例尺尺寸变化 优点&#xff1a;结合第1和第2种方式的…

3接上篇 我的自定义GPTs的改进优化 与物理世界连接成功 GPTs的创建与使用定义和执行特定任务的功能模块 通过API与外部系统或服务的交互

https://blog.csdn.net/chenhao0568/article/details/134875067?spm1001.2014.3001.5502 从服务器日志里看到请求多了一个“location” 23.102.140.123 - - [08/Dec/2023:14:02:20 0800] "GET /getWeather.php?location&locationNewYork HTTP/1.1" 200 337 &…

机器学习与低代码开发:创新驱动的双剑合璧

引言 随着科技的日新月异&#xff0c;机器学习和低代码开发已经成为引领技术行业变革的两大重要趋势。机器学习通过模拟人类的学习方式&#xff0c;让计算机具备了自我学习和预测的能力&#xff0c;打破了传统计算机程序的局限性。而低代码开发则以简化软件开发过程为目标&…

Gateway和spring-boot-starter-web的恩怨情仇

为什么取这个题目&#xff0c;其实与我踩到的坑有关&#xff0c;说起来这个坑非常神奇&#xff0c;这里面就涉及到Gateway和spring-boot-starter-web底层所依赖的技术不兼容的问题。 一、背景 SpringCloud 版本 ---- Finchley.SR2 SpringBoot 版本 ---- 2.0.6.RELEASE 如果同…

排序算法-插入/希尔排序

1 插入排序 1.1基本思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;其基本思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中&#xff0c;直到所有的记录插入完为止&#xff0c;得到一个新的有序序列 。 1.2直…

Selenium自动化测试总结

一、Selenium自动化测试&#xff08;基于python&#xff09; 1、Selenium简介&#xff1a; 1.1 Selenium是一款主要用于Web应用程序自动化测试的工具集合。Selenium测试直接运行在浏览器中&#xff0c;本质是通过驱动浏览器&#xff0c;模拟浏览器的操作&#xff0c;比如跳转、…

通过静态HTTP实现负载均衡

在当今的互联网环境中&#xff0c;随着用户数量的不断增加和业务需求的不断扩大&#xff0c;单台服务器往往无法承受所有的访问压力。为了确保网站的可用性和性能&#xff0c;负载均衡成为了一种常见的解决方案。本文将探讨如何通过静态HTTP实现负载均衡&#xff0c;以提升网站…

vue3移动端脚手架(纯净,集成丰富)

概述 一个纯净的移动端框架 &#xff0c;用到了 Vue3 vuex Vite3 Vant3 sass eslint stylelint htmlhint husky commitlint axios axios-adapter VConsole 自定义全局 loading &#xff0c;自定义函数式 dialog &#xff08;api模仿微信小程序&#xff09;&#x…