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

news2024/12/24 2:17:16

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)
            })
    })
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

​hashlib --- 安全哈希与消息摘要​

源码&#xff1a; Lib/hashlib.py 本模块针对许多不同的安全哈希和消息摘要算法实现了一个通用接口。 包括了 FIPS 安全哈希算法 SHA1, SHA224, SHA256, SHA384, SHA512, (定义见 the FIPS 180-4 standard), SHA-3 系列 (定义见 the FIPS 202 standard) 以及 RSA 的 MD5 算法 (…

HarmonyOS首次尝试-HelloWorld

我的旧手机是个HUAWEI PCT-AL10 HarmonyOS 3.0.0(Android 10) 插上后&#xff0c;studio能显示连接上了手机设备&#xff0c;创建的demo使用的是API9&#xff0c;也就是当前的最新版本。 点击运行报错&#xff1a; 点击去往帮助页&#xff0c;做的也挺好&#xff0c;有直达的…

OpenAI 承认 ChatGPT 最近确实变懒,承诺修复问题

文章目录 一. ChatGPT 指令遵循能力下降引发用户投诉1.1 用户抱怨回应速度慢、敷衍回答、拒绝回答和中断会话 二. OpenAI 官方确认 ChatGPT 存在问题&#xff0c;展开调查三. OpenAI 解释模型行为差异&#xff0c;回应用户质疑四. GPT-4 模型变更受人事动荡和延期影响 一. Chat…

电子学会C/C++编程等级考试2022年09月(五级)真题解析

C/C++等级考试(1~8级)全部真题・点这里 第1题:城堡问题 1 2 3 4 5 6 7 ############################# 1 # | # | # | | # #####---#####---#---#####---# 2 # # | # # # # # #---#####---#####---#####---# 3 # | | # # # # # #---#########---#####---#---# 4 # # | | | …

30、Linux安全配置

文章目录 一、Linux安全配置简介二、Linux安全配置2.1 网络配置2.2 防火墙配置2.2.1 确定防火墙区域配置 2.3 日志和审核2.4 访问、认证和授权2.4.1 SSH配置2.4.2 PAM模块配置 一、Linux安全配置简介 Linux种类较多&#xff0c;常用的有Redhat、Ubantu、Centos等。这里以Cento…

本地项目通过Gitee上传代码码云仓库(保姆级教程)

前提 1.已经下载过Git Bash Git bash安装包教程 2.在Gitee上创建该项目的远程仓库 3.进入本地你想要上传的文件目录下&#xff0c;右键单击空白处&#xff0c;点击Git Bash Here 4.配置你邮箱和email 邮箱在设置可以看到 ----- 用户名可用在个人主页admin 下面那个就是用户…

C语言:高精度乘法

P1303 A*B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 第一次画图&#xff0c;略显简陋。 由图可以看出c的小标与x,y下标的关系为x的下标加上y的下标再减一。 由此得到&#xff1a; c [ i j - 1 ] x [ i ] * y [ j ]x #include<stdio.h> #include<st…

第二证券:如何申购新股?

跟着科技的展开&#xff0c;股市的展开也变得越来越快速。在股市上&#xff0c;申购新股是许多出资者寻求短期利润的一种方法。但是&#xff0c;申购新股并不是简略的作业。那么&#xff0c;在申购新股时&#xff0c;有哪些问题需求咱们重视呢&#xff1f;在本文中&#xff0c;…

重要功能更新:妙手ERP上线物流追踪功能,全方位助力跨境卖家轻松掌握包裹动态!

由于跨境物流转运环节多&#xff0c;历程耗时长&#xff0c;途中不可控因素多&#xff0c;容易导致包裹状态异常&#xff0c;从而引起买家客诉&#xff0c;造成卖家运营损失。因而&#xff0c;可随时查看物流信息、掌握包裹动态&#xff0c;是跨境运营中至关重要的一环。 为此…

在windows11上彻底关闭系统更新

最近在windows11系统上发现网上的一些方法不太有效&#xff0c;系统还是会自己更新。像该注册表&#xff0c;计划任务等这些&#xff0c;在windows11上都不太行。下面介绍一个在windows11上有效的方法&#xff0c;先看看效果图吧。如下&#xff1a; 在最新windows11上面 在较新…

一览汽配CRM系统的价格与功能:企业决策者的指南

随着汽车行业的快速发展&#xff0c;汽车配件市场也呈现出蓬勃的增长态势。然而&#xff0c;随之而来的是市场竞争的加剧和管理难题的增多。为了应对这些挑战&#xff0c;汽配行业也引入了CRM客户管理系统。本文将简要向您介绍&#xff0c;汽配CRM是什么&#xff0c;有什么功能…

【教程】Ipa Guard为iOS应用提供免费加密混淆方案

概述&#xff1a;使用ios加固工具对ios代码保护&#xff0c;保护ios项目中的核心代码&#xff0c; #ipagurd年终大促百厂联动暖冬特惠&#xff0c;超多软控件立享惊喜优惠>> ​ 简介 iOS加固保护是直接针对ios ipa二进制文件的保护技术&#xff0c;可以对iOS APP中的可…

9:00面试,9:05就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到12月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40…

关键点检测☞png格式换bmp,且labelme标注的json中imagePath同步修改格式

import os import cv2 import jsondef bmp2jpg(in_img_path, out_dir_name): # .png -> .bmp# img = cv2.imread(in_img_path) # 彩色图片,位深24img =</

125. LCR图书整理 II

LCR 125. 图书整理 II 题目&#xff1a; 读者来到图书馆排队借还书&#xff0c;图书管理员使用两个书车来完成整理借还书的任务。书车中的书从下往上叠加存放&#xff0c;图书管理员每次只能拿取书车顶部的书。排队的读者会有两种操作&#xff1a; push(bookID)&#xff1a;…

web279(s2-001)

目前java小白一个&#xff0c;主要是学学别人的思路 进入题目&#xff0c;登录框一个 抓包也没发现什么东西 网上说是struts2框架 Struts2是用Java语言编写的一个基于MVC设计模式的Web应用框架 判断是不是基于struts2的一些方法&#xff1a; 1.通过页面回显的错误消息来判断…

Python从入门到精通八:Python文件操作

文件的编码 思考&#xff1a;计算机只能识别&#xff1a;0和1&#xff0c;那么我们丰富的文本文件是如何被计算机识别&#xff0c;并存储在硬盘中呢&#xff1f; 答案&#xff1a;使用编码技术&#xff08;密码本&#xff09;将内容翻译成0和1存入。 编码技术即&#xff1a;…

十九)Stable Diffusion使用教程:ai室内设计案例

今天我们聊聊如何通过SD进行室内设计装修。 基础起手式&#xff1a; 选择常用算法&#xff0c;抽卡&#xff1a; 这里要安装一个插件&#xff0c;latent couple&#xff08;潜变量成对&#xff09;&#xff1a; 安装地址如下&#xff1a; GitHub - ashen-sensored/stable-diff…

Java调用百度翻译API和调用有道翻译API进行翻译

目录 界面编写 调用百度API 调用有道API 源代码 界面编写 我们首先需要设计出这个翻译程序的GUI界面&#xff0c;我们写一个类继承自JFrame类&#xff0c;用来展示程序的主窗口&#xff0c;设置好窗口的名称和大小&#xff0c;设置在关闭窗口时终止程序&#xff0c;为了界…