Springboot + Vue 下载Word、PDF文档并保留内部格式

news2024/11/29 23:30:12

相对于上传,下载时复杂的地方就是文件中文名称乱码

前端

            <el-button @click="clickCall('handleExport', scope,index)">导出</el-button>
 // 文件下载操作
    handleExport(row) {
      axios
        .get(**********master/proj/exportContract?id=" + row.id, {
          responseType: "blob",
          headers: { Authorization: Cookie.get("**********") },
        })
        .then((response) => {

       // 获取后端返回的文件名
        const contentDisposition = response.headers["content-disposition"];
        const fileNameMatch = contentDisposition.match(/filename="(.+)"/);
        console.log(fileNameMatch[1])
        const fileName = this.binaryStringToString(fileNameMatch[1])
        // 创建URL并模拟点击下载链接
        const url = window.URL.createObjectURL(new Blob([response.data]));
        const link = document.createElement("a");
        link.href = url;
        link.setAttribute("download", fileName);
        document.body.appendChild(link);
        link.click();
        })
        .catch((err) => {
          this.$message.error(`数据导出失败,${err.message}`);
        });
    },
    binaryStringToString(binaryStr){
    	  const binaryBytes = binaryStr.split(" ");
 		 const bytes = binaryBytes.map(binaryByte => parseInt(binaryByte, 2));
 		 const utf8String = new TextDecoder().decode(new Uint8Array(bytes));
 		 return utf8String;
    },

后端

    @ApiOperation("导出合同文件")
    @GetMapping("exportContract")
    public ResponseEntity<Resource> exportData(@RequestParam(value="id")Integer id) throws Exception {
        return projectService.exportData(id);
    }
      @Override
    public ResponseEntity<Resource> exportData(Integer id) throws IOException {
        Project project = projectRepo.getById(Long.valueOf(id));
        if (project.getContactFile().isBlank()) {
            throw (new BizExceptEntityNotFound("文件不存在!"));
        }
        File file = new File(project.getContactFile());
        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

        String binaryString  = stringToBinary(project.getContactFile().split("/")[2]);
        System.out.println(project.getContactFile().split("/")[2]);
        System.out.println(binaryString );
        System.out.println(binaryToString(binaryString ));
        headers.setContentDisposition(ContentDisposition.parse("attachment; filename=" +binaryString  ));
        return new ResponseEntity<>(new FileSystemResource(file), headers, HttpStatus.OK);
    }

    /**
     * 字符串转8位一组的二进制字符串
     * @param inputString
     * @return
     */
    public static String stringToBinary(String inputString) {
        byte[] utf8Bytes = inputString.getBytes(StandardCharsets.UTF_8);
        StringBuilder binaryStr = new StringBuilder();
        for (byte b : utf8Bytes) {
            String binaryByte = String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
            binaryStr.append(binaryByte).append(" ");
        }
        return binaryStr.toString().trim();
    }

        public static String binaryToString(String binaryStr) {
            StringBuilder result = new StringBuilder();
            String[] binaryBytes = binaryStr.split(" ");
            byte[] bytes = new byte[binaryBytes.length];
            for (int i = 0; i < binaryBytes.length; i++) {
                bytes[i] = (byte) Integer.parseInt(binaryBytes[i], 2);
            }
            result.append(new String(bytes, StandardCharsets.UTF_8));
            return result.toString();
        }

我采用的是把文件名转成二进制传输,再转化回去。最后没乱

在这里插入图片描述

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

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

相关文章

前端node.js入门

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Node.js 入门 什么是 Node.js&#xff1f; 什么是前端工程化&#xff1f; Node.js 为何能执行 JS&…

netty组件详解-上

netty服务端示例: private void doStart() throws InterruptedException {System.out.println("netty服务已启动");// 线程组EventLoopGroup group new NioEventLoopGroup();try {// 创建服务器端引导类ServerBootstrap server new ServerBootstrap();// 初始化服…

CDHD高创驱动器通过ServoStudio备份和恢复参数的具体方法步骤

CDHD高创驱动器通过ServoStudio备份和恢复参数的具体方法步骤 硬件连接: 如下图所示,通过通信线缆将伺服驱动器和电脑进行连接,一端为RJ11,一端为USB, 软件连接: 打开伺服调试软件ServoStudio,在驱动器配置中找到连接—自动连接,点击搜索&连接,此时软件会自动搜索…

基于jsp+sevlet+mysql实验室设备管理系统2.0

基于jspsevletmysql实验室设备管理系统2.0 一、系统介绍二、功能展示1.控制台2.申购设备3.设备列表4.设备维护5.设备类型6.报废设备7.维修记录 四、其他系统实现五、获取源码 一、系统介绍 系统主要功能&#xff1a; 普通用户&#xff1a;控制台、申购设备、设备列表、设备维护…

docker 安装oracle 11g

docker 安装oracle 11g 拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11g创建容器 docker run -d -p 1521:1521 --name oracle11g registry.cn-hangzhou.aliyuncs.com/helowin/oracle_11gD:\docker\oracle\oracle11g>docker exec -it oracle11…

CMU 15-445 -- Query Optimization - 10

CMU 15-445 -- Query Optimization - 10 引言Query Optimization TechniquesQuery RewritingPredicate PushdownProjections Pushdown Cost-based SearchCost EstimationStatisticsEquality PredicateRange PredicateNegation QueryConjunction QueryDisjunction QueryJoins直方…

山西电力市场日前价格预测【2023-07-19】

日前价格预测 预测明日&#xff08;2023-07-19&#xff09;山西电力市场全天平均日前电价为362.73元/MWh。其中&#xff0c;最高日前电价为395.74元/MWh&#xff0c;预计出现在06: 00。最低日前电价为316.17元/MWh&#xff0c;预计出现在13: 45。 价差方向预测 1&#xff1a;实…

ES6标准下在if中进行函数声明

ES5中规定&#xff0c;函数只能在顶层作用域或函数作用域之中声明&#xff0c;不能在块级作用域声明。 // 情况一 if (true) {function f() {} }// 情况二 try {function f() {} } catch(e) {// ... }上面两种函数声明&#xff0c;根据 ES5 的规定都是非法的。但是&#xff0c…

win10 host 配置不生效 浏览器访问无效

遇到了一个比较坑的问题&#xff0c;host配置不生效。电脑是win10&#xff0c;排查了一个小时&#xff0c;刚开始我先排查编码是否有问题&#xff0c;然后又排查是不是权限的问题&#xff0c;经过我的修改编码和权限还是有问题&#xff0c;也查看了一些博客也没找到跟我出现一样…

从零搭建vue+electron桌面应用

从零搭建vueelectron桌面应用 一、准备工作1.全局下载electron2.全局下载vue脚手架3.创建vue项目&#xff08;这里用的是vue2版本&#xff09;4.安装打包插件5.安装electron-builder&#xff0c;安装后可以直接生成主进程的配置文件6.在vue.config.js中添加以下配置 二、运行项…

SpringCloud(五)Gateway 路由网关

一、路由网关 官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/ 我们需要连接互联网&#xff0c;那么就需要将手机或是电脑连接到家里的路由器才可以&#xff0c;而路由器则连接光猫&#xff0c;光猫再通过光纤连接到互联网&a…

Linux 的远程唤醒

Linux (Ubuntu、Debian、Centos …) 的远程唤醒 环境说明&#xff1a; 两台局域网内的 linux 主机&#xff0c;本环境的系统为 loongnix 目的主机为&#xff1a;IP 192.168.12.11 MAC 86:d8:60:47:28:22远程主机为&#xff1a;IP 192.168.12.15 一、唤醒准备工作 (目的机上操…

Sentinel限流--流控模式与限流效果

文章目录 1、簇点链路2、流控入门案例3、流控模式&#xff1a;关联模式4、流控模式&#xff1a;链路模式5、流控效果&#xff1a;warm up6、限流效果&#xff1a;排队等待7、热点参数限流 1、簇点链路 簇点链路就是项目内的调用链路&#xff08;controller -> servcie ->…

python-在transformers的问答模型中使用中文

先安装transformers在huggingface下载模型 模型bert-multi-cased-finetuned-xquadv1可以从huggingface中下载&#xff0c;具体操作方法可以参照文章https://blog.csdn.net/zhaomengsen/article/details/130616837下载 git clone就可以了然后使用pipline加载模型 from transfor…

【卫朋】华为 IFS 集成财经服务流程(限制版)

目录 简介 集成财经服务 专栏列表 CSDN学院 简介 今天主要来谈谈华为流程体系中的财经流程。 大家可以看下面这张图。 深蓝色标注的就是 IFS 流程的在企业整体流程架构中的位置。 财经部门其实也是直接或间接跟客户打交道的。 这就意味着&#xff0c;财经也是需要做端到…

Unity源码分享-大量鱼类模型Underwater Animals Pack

Unity源码分享-大量鱼类模型Underwater Animals Pack 下载地址&#xff1a;https://download.csdn.net/download/Highning0007/88061483

FPGA XDMA 中断模式实现 PCIE3.0 HDMI视频采集卡 提供2套工程源码和QT上位机源码

目录 1、前言2、我已有的PCIE方案3、PCIE理论4、总体设计思路和方案视频采集和缓存XDMA简介XDMA中断模式QT上位机及其源码 5、vivado工程详解6、上板调试验证7、福利&#xff1a;工程代码的获取 1、前言 PCIE&#xff08;PCI Express&#xff09;采用了目前业内流行的点对点串…

中国芯片发出怒吼,要求回购700台光刻机,ASML承受不起

多家媒体报道指国内知名存储芯片企业长江存储的董事长指出已买回的光刻机因维护和零件问题可能无法使用&#xff0c;因此提出基于公平原则&#xff0c;ASML理应回购这些光刻机&#xff0c;凸显出中国芯片企业的愤怒。 由于美国的阻挠&#xff0c;ASML不仅不会继续对中国出售先进…

工厂方法模式(java)

目录 结构 案例 类图 代码实现 抽象咖啡工厂 美式咖啡工厂 拿铁咖啡工厂 咖啡类&#xff08;抽象产品类&#xff09; 美式咖啡 拿铁咖啡 咖啡店类 测试类 优缺点 优点 缺点 结构 工厂方法模式的主要角色&#xff1a; 抽象工厂&#xff08;Abstract Factory&…

MySQL常用语句

目录 连接MySQL 数据库操作 表的操作 数据操作 进阶查询 源码等资料获取方法 连接MySQL -- 语法&#xff1a;mysql -u用户名 -p密码 注&#xff1a;--空格 起到注释的作用 mysql -uroot -p123456 数据库操作 -- 显示当前时间、用户名、数据库版本&#xff08;可以单独…