springboot使用attachment方式下载文件损坏问题解决

news2024/12/23 17:01:32

文章目录

场景

之前使用springboot下载文件一直正常,今天新对接一个接口出现文件破损,无法下载。

之前的代码:

    @Override
    public ResponseEntity<ByteArrayResource> resultExcel(ExcelResultDTO excelResultDTO) {
        log.info("--------------- enter resultExcel method : args = {}------------------", JsonUtils.toJsonString(excelResultDTO));
        EcTaskDO ecTaskDO = ecTaskMapper.selectById(excelResultDTO.getTaskId());
        // 请求第三方接口
        ForestResponse<byte[]> response = ecAiApi.result_excel(ecTaskDO.getMissionId(), excelResultDTO.getIndex());


        if (response.isSuccess()) {
            byte[] content = response.getResult();

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", "downloaded_file");

            return ResponseEntity.ok()
                    .headers(headers)
                    .body(new ByteArrayResource(content));
        } else {
            // 处理请求失败的情况
            return ResponseEntity.internalServerError().build();
        }


    }

现在有个新接口对接,仿照写了个

 @Override
    public ResponseEntity<ByteArrayResource> getBatchExcelModel(BatchExcelDTO batchExcelDTO) {
        Long userId = getLoginUserId();

        // 组装数据
        CheckValidationPojo checkValidationPojo = new CheckValidationPojo();
        checkValidationPojo.setFileId(batchExcelDTO.getAbacusId() + "");
        checkValidationPojo.setTaskName("");
        checkValidationPojo.setUserId(userId);

        batchGetCheckValiationPojo(batchExcelDTO, checkValidationPojo);

        // 赋值 (数据信息 和 按钮值 和输出信息信息)
        ExcelModelReq excelModelReq = new ExcelModelReq();
        excelModelReq.setJsonStr(new Gson().toJson(checkValidationPojo));

        ForestResponse<byte[]> response = ecAiApi.getBatchList(excelModelReq);
        if (response.isSuccess()) {
            byte[] content = response.getResult();
            String contentDisposition  = response.getHeaders().get("Content-Disposition");
            log.info(contentDisposition);
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            if (contentDisposition!= null && contentDisposition.contains("filename=")) {
                String fileName = contentDisposition.substring(contentDisposition.indexOf("filename=") + 9);
                log.info(fileName.replace("\"",""));
                headers.setContentDispositionFormData("attachment", fileName.replace("\"",""));
            } else {
                // 如果响应头中没有文件名,可以设置一个默认文件名
                headers.setContentDispositionFormData("attachment", "defaultFileName.xlsx");
            }
            return ResponseEntity.ok()
                    .headers(headers)
                    .body(new ByteArrayResource(content));
        } else {
            // 处理请求失败的情况
            return ResponseEntity.internalServerError().build();
        }
    }

解决方式

在这里插入图片描述
添加这行代码就可以了。

全部代码

 @Override
    public ResponseEntity<ByteArrayResource> getBatchExcelModel(BatchExcelDTO batchExcelDTO) {
        Long userId = getLoginUserId();

        // 组装数据
        CheckValidationPojo checkValidationPojo = new CheckValidationPojo();
        checkValidationPojo.setFileId(batchExcelDTO.getAbacusId() + "");
        checkValidationPojo.setTaskName("");
        checkValidationPojo.setUserId(userId);

        batchGetCheckValiationPojo(batchExcelDTO, checkValidationPojo);

        // 赋值 (数据信息 和 按钮值 和输出信息信息)
        ExcelModelReq excelModelReq = new ExcelModelReq();
        excelModelReq.setJsonStr(new Gson().toJson(checkValidationPojo));

        ForestResponse<byte[]> response = ecAiApi.getBatchList(excelModelReq);

        if (response.isSuccess()) {
            byte[] content = response.getResult();
            String contentDisposition  = response.getHeaders().get("Content-Disposition");

            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentType(new MediaType("application", "force-download"));
//            headers.set(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=my_file.csv");
            if (contentDisposition!= null && contentDisposition.contains("filename=")) {
                String fileName = contentDisposition.substring(contentDisposition.indexOf("filename=") + 9);
                log.info(fileName.replace("\"",""));
                headers.setContentDispositionFormData("attachment", fileName.replace("\"",""));
            } else {
                // 如果响应头中没有文件名,可以设置一个默认文件名
                headers.setContentDispositionFormData("attachment", "defaultFileName.xlsx");
            }
            return ResponseEntity.ok()
                    .headers(headers)
                    .body(new ByteArrayResource(content));
        } else {
            // 处理请求失败的情况
            return ResponseEntity.internalServerError().build();
        }

    }


大功告成!!!

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

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

相关文章

CentOS7系统内核升级

1. 安装新内核 采用离线方式升级 去到下面网站中下载rpm安装包 https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/下载 wget https://mirrors.coreix.net/elrepo-archive-archive/kernel/el7/x86_64/RPMS/kernel-lt-5.4.278-1.el7.elrepo.x86_64…

探寻闲鱼libsgmain加解密算法(4) ——JNI入口跳转

关注我的人都知道我一直在学习阿里的加密和算法&#xff0c;除了研究逆向问题&#xff0c;还会把学来的阿里技术用在自己的应用上。 为什么&#xff1f;因为学习大厂的应用&#xff0c;是进步最快的方法。而大厂在安全和加密方面的技术&#xff0c;个人觉得阿里做的是最好的。 …

Maven项目管理工具-初始+环境配置

1. Maven的概念 1.1. 什么是Maven Maven是跨平台的项目管理工具。主要服务于基于Java平台的项目构建&#xff0c;依赖管理和项目信息管理。 理想的项目构建&#xff1a;高度自动化&#xff0c;跨平台&#xff0c;可重用的组件&#xff0c;标准化的流程 maven能够自动下载依…

Maven 不同环境灵活构建

需求: 使用 Maven根据不同的构建环境&#xff08;如开发、测试、生产&#xff09;来定义不同的配置&#xff0c;实现灵活的构建管理。 需要Demo项目的可以参考&#xff1a;我的demo项目 一、项目分层 一般的初创项目不会有特别多的配置文件&#xff0c;所以使用 spring.profile…

Android调用系统相机录像并设置参数

最近要做一个 Android上的录像功能&#xff0c;由于之前做拍照功能完全是用自定义方式&#xff0c;太麻烦。故这次决定直接调用系统相机来录像。 一、添加权限 首先&#xff0c;添加必要的权限 <!-- 授予该程序使用摄像头的权限 --><uses-permission android:name&q…

K8s中TSL证书如何续期

TSL是什么 K8s中的作用是什么&#xff1f; 在 Kubernetes&#xff08;K8s&#xff09;中&#xff0c;TSL 指的是 Transport Layer Security&#xff0c;也就是传输层安全协议。它是用来保护在网络上传输的数据的安全性和隐私性。 TSL 在 Kubernetes 中的作用包括&#xff1a;…

B+树(B树的改进)

目录 一、什么是B树&#xff1f; 二、B树的性质 1.B树被广泛作为数据库索引的索引结构 2.m个分支的结点有m个元素 3.每个元素对应子结点最大值 4.多级索引结构 5.叶子结点层包含所有元素 三、B树和B树的区别 四、B树的查找 1.顺序查找 2.随机查找 3.范围查找 一、什…

JVM机制

文章目录 JVM 简介JVM内存划分堆&#xff08;线程共享&#xff09;Java虚拟机栈&#xff08;线程私有&#xff09;本地方法栈&#xff08;线程私有&#xff09;程序计数器&#xff08;线程私有&#xff09;方法区&#xff08;线程共享&#xff09; JVM类加载机制类加载过程双亲…

校园表白墙源码修复版

此校园表白墙源码基于thinkphp&#xff0c;因为时代久远有不少bug&#xff0c;经本人修复已去除大部分bug&#xff0c;添加了美化元素。 https://pan.quark.cn/s/1f9b3564c84b https://pan.baidu.com/s/1bb9vu9VV2jJoo9-GF6W3xw?pwd7293 https://caiyun.139.com/m/i?2hoTc…

群控系统服务端开发模式-应用开发-业务架构逻辑开发准备工作

安装与仓库已经调整完毕&#xff0c;现在开发业务架构逻辑&#xff0c;其次再开发功能逻辑。业务架构逻辑开发与功能逻辑开发不是一回事&#xff0c;一定要明白。业务架构指的是做某一件事或是某一种类型的事的逻辑&#xff0c;在互联网web应用中通常指一套系统的外在逻辑&…

js 的宏任务和微任务

宏任务 (macro-task) 与微任务 (micro-task) 在 JavaScript 中&#xff0c;宏任务&#xff08;macro-task&#xff09;和微任务&#xff08;micro-task&#xff09;是任务队列&#xff08;task queue&#xff09;中两个不同的任务类型&#xff0c;它们是 JavaScript 异步编程机…

DBeaver查看已保存连接的密码

打开Dbeaver窗口菜单-首选项-工作空间&#xff0c;找到工作空间路径 在文件管理器中打开工作空间路径\General.dbeaver&#xff0c;找到credentials-config.json。 在Linux下&#xff0c;使用如下命令对credentials-config.json文件进行解密 openssl aes-128-cbc -d -K babb4…

13 实战:使用Python和Pygame实现视频运动估计播放器

首先看运行效果: 在多媒体处理领域,视频的运动估计是一个重要的课题。在本文中,我们将详细介绍如何使用Python结合Pygame、OpenCV等库,实现一个支持运动估计的视频播放器。本项目旨在展示如何在Python中处理视频帧,实现块匹配算法进行运动估计,并将结果以可视化的方式呈现…

kafka 分布式(不是单机)的情况下,如何保证消息的顺序消费?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 分布式&#xff08;不是单机&#xff09;的情况下&#xff0c;如何保证消息的顺序消费?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 分布式&#xff08;不是单机&#xff09;的情况下&#xff0c;如何保证消息的…

TypeScript基础简介

TypeScript是Javascript的一个超集。 TypeScript在原有的基础之上又添加了编译器类型检查的功能&#xff0c;意味着如果使用ts进行开发&#xff0c;会对变量的类型进行较为严格的验证&#xff0c;防止程序员写出可能出错的代码&#xff0c;规范变成习惯&#xff0c;适合大项目开…

2024年MathorCup妈杯大数据竞赛选题人数发布

经过24个小时&#xff0c;各个平台的相关选题投票、相关文章阅读量等各项数据进行统计&#xff0c;利用之前的评估办法&#xff08;详见注释&#xff09;。在开赛后24小时&#xff0c;我们基本确定各个赛题选题人数&#xff0c;以帮助大家更好地分析赛题局势。 题目人数A46B72 …

【Vulnhub靶场】DC-4

DC-4靶场下载地址https://www.five86.com/downloads/DC-4.zip 本机IP&#xff1a;192.168.118.128 靶机IP&#xff1a;192.168.118.0/24 信息收集 扫描主机存活&#xff0c;扫描端口&#xff0c;扫描服务 第一步扫描出主机ip为192.168.118.141 nmap -sP 192.168.118.0/24 nm…

Java后端面试题:Java基础篇

目录 Java基础 1.请你说说Java中基本数据类型的bit长度&#xff1f; 2.switch支持哪些数据类型&#xff1f;支持long么&#xff1f; 3.讲一下常见编码方式&#xff1f; 4.char能不能存储中文&#xff1f; 5.为什么数组索引从0开始呢&#xff1f;假如从1开始不行吗&#xf…

Java篇图书管理系统

目录 前言 一. 图书管理系统的核心 二. 图书管理系统基本框架 2.1 book包 2.1.1 Book&#xff08;书籍类&#xff09; 2.1.2 Booklist (书架类&#xff09; 2.2 user包 2.2.1 User类 2.2.2 Administrator(管理员类) 2.2.3 Visitor&#xff08;用户类&#xff09; 2.…

数据结构 - 散列表,初探

今天我们继续学习新的数据结构-散列表。 01定义 我们先来了解一些常见概念名词解释。 散列&#xff1a;散列表的实现叫做散列&#xff0c;是一种实现以常数级时间复杂度执行查找、插入和删除的技术&#xff1b; 散列值&#xff1a;通过散列函数对输入值&#xff08;key&…