SpringBoot下载文件的正确方式~

Spring Boot 实战:轻松实现文件上传与下载功能 本文围绕 Spring Boot 文件上传与下载功能展开。介绍其依赖引入、配置设置,详述上传接口编写与安全要点,涵盖类型限制、大小验证及防覆盖措施。在下载功能上,讲解从基础接口到异常处理再到断点续传的实现,并以实战案例展示应用场景,为开发者提供全面实用的功能开发指引,助其构建相关应用系统。 阅读详情

Spring Boot 配合 axios 实现文件下载功能

前言

最近遇到一个奇怪的需求,前端通过post请求下载压缩文件,同时会传给后端一些数据,用于生成压缩包。此时后端接口就不仅仅是生成压缩文件流输出给前端。而必须要有报错能力与异常处理能力。即如果后端报错,前端应该是下载不了文件流。

比较一般的解法

一般而言,Spring Boot生成文件流供前端下载,会直接将文件流写入到 HttpServletResponse.getOutputStream(),然而这样会有一个问题,无论后端如何报错,前端都能成功下载文件,因为 status=200。即如下写法:

@PostMapping(value = "/project/code/download")
public void downloadCode(@RequestBody TProjectInfo pf, HttpServletResponse response) {
    // 1.生成源码文件
    // 2.压缩文件
    // 3.设置回复的一些参数
    // 4.将压缩文件写入网络流
    log.info("request param: {}", pf);
    OutputStream os = null;
        try {
            // 配置文件下载
            // 下载文件能正常显示中文
            String filename = pf.getProjectName() + System.currentTimeMillis() + ".zip";
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);
            response.setHeader("Content-Type", "application/octet-stream");
            response.setContentType("application/octet-stream; charset=UTF-8");

            os = response.getOutputStream();

            projectService.generateCode(pf, os);

            log.info("Download  successfully!");
        } catch (Exception e) {
            log.error("Download  failed: {}", e.getMessage());
            throw new OptErrorException(OptStatus.FAIL.code, "文件下载失败");
        } finally {
            if (os != null) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
}

分析原因

因为后端直接向OutputStream写入,会覆盖所有异常捕获,因此前端直接向data下取字节流数据即可。

正确解法

其实就是要后端能在错误时返回json数据,正确下载时直接取data下取字节流即可,所以使用 ResponseEntity 返回即可。

@PostMapping(value = "/project/code/download")
public ResponseEntity<InputStreamResource> downloadCode(@RequestBody TProjectInfo pf) {
   log.info("request param: {}", pf);

   String filename = pf.getProjectName() + System.currentTimeMillis() + ".zip";
   byte[] bytes = projectService.generateCode(pf);
   ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

   HttpHeaders headers = new HttpHeaders();
   headers.add("Content-Disposition", String.format("attachment; filename=\"%s\"", filename));
   return ResponseEntity.ok()
           .headers(headers)
           .contentType(MediaType.parseMediaType("application/octet-stream"))
           .body(new InputStreamResource(bais));
}

这里的异常,使用RestExceptionAdvice统一处理:

@RestControllerAdvice
public class ExceptionAdvice {
    private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);

    /**
     * 处理数据绑定异常
     *
     * @param bindException 数据绑定异常
     * @return 统一响应基本结果
     */
    @ExceptionHandler(value = BindException.class)
    public ResponseEntity<Result<Object>> handleValidateException(BindException bindException) {
        logger.error("数据绑定异常,{}", bindException.getMessage(), bindException);
        return of(HttpStatus.BAD_REQUEST, "数据绑定异常");
    }


    /**
     * 统一处理 405 异常
     *
     * @param exception 请求方法不支持异常
     * @return 统一响应结果
     */
    @ExceptionHandler(value = HttpRequestMethodNotSupportedException.class)
    public ResponseEntity<Result<Object>> handleMethodNotSupportedException(HttpRequestMethodNotSupportedException exception) {
        if (exception != null) {
            logger.error("Http 405, {}", exception.getMessage(), exception);
        }

        return of(HttpStatus.METHOD_NOT_ALLOWED, "方法不被支持");

    }

    private ResponseEntity<Result<Object>> of(HttpStatus status, String msg) {
        return ResponseEntity.status(status).body(Result.builder().code(OptStatus.FAIL.code).msg(msg).build());
    }

    /**
     * 统一处理自定义操作错误异常
     *
     * @param exception 操作错误异常
     * @return 统一响应结果
     */
    @ExceptionHandler(value = OptErrorException.class)
    public ResponseEntity<Result<Object>> handleOptErrorException(OptErrorException exception) {
        return of(HttpStatus.INTERNAL_SERVER_ERROR, exception.getOptMsg());
    }

    /**
     * 统一处理 服务器内部 异常
     *
     * @param e 异常
     * @return 统一响应结果
     */
    @ExceptionHandler(value = Throwable.class)
    public ResponseEntity<Result<Object>> handle500(Throwable e) {
        if (e != null) {
            logger.error("Http 500, {}", e.getMessage(), e);
        }
        return of(HttpStatus.INTERNAL_SERVER_ERROR, "服务器内部未知错误");
    }

}

以上就是解决的全过程,可能写得有点片面,纯属一点个人实践中的见解。欢迎各位交流学习!

使用Spring Boot实现文件下载功能 通过创建一个RestController处理文件下载请求,并设置响应头和输出文件流,实现了简单而有效的文件下载功能。文件下载是Web应用中常见的功能之一,通过Spring Boot可以很方便地实现文件下载功能。本文将详细介绍如何使用Spring Boot编写一个简单的文件下载接口,包括处理文件下载请求、设置响应头和实现文件流输出等。可以使用Spring Initializr(https://start.spring.io/)快速生成一个基础的Spring Boot项目,添加Web依赖即可。 阅读详情

相关推荐

SpringBoot文件上传下载详解

下载的原理其实就是根据你要下载的文件名看看我们的磁盘中有没有这个文件对比一下文件名字,如果有就下载,没有就下载失败。首先理解一下文件上传的原理,其实就是把传过来的文件存到我们的磁盘上,既然要存磁盘所以我们得指定文件存储的路径等。这篇文章记录我自己的学习过程的SpringBoot的文件上传下载的代码的理解。代码写完了介绍问了,接下来测试一下看看我们的接口能不能用。可以看到上传成功了,也生成了文件名。首先先把代码写上,然后逐一理解。我的路径值得就是这个。

Fzyabc的博客 1292

springboot(七):springboot如何实现文件下载

我们来赖回顾一下,上期所讲的内容是使用spring boot进行文件的上传管理, 比如在实际开发我们在前端所用到的图片文件,就需要将文件上传到服务器上, 要用的时候在去拿,这样就减少了本地内存的占用, 这里有个推荐七牛云大家可以去了解一下,对于文件的管理很有效果 介绍 开始今天的知识点,今天要说的是springboot去下载自己生成的xls文件, 我们将从数据库查询到的数据放入lxs文...

ApassionBoy 5604

SpringBoot 普通文件下载 + 前端获取后端返回的文件流并下载

⏹SpringBoot 普通文件下载 + 前端获取后端返回的文件流并下载

菜鸟记录 2万+

SpringBoot实现文件下载

本文纯属转载,主要是为了方便后续参考和继续使用,转载自博客Spring Boot项目实现下载项目根目录下指定目录(doc)里的文件。 代码参考如下: 一、接收页面下载的请求,开始下载项目中的文件 @RequestMapping("downloadFile") @ResponseBody public void Download(HttpServletResponse response) {...

polo2044的专栏 1万+

springboot 下载文件, 通过IO流的方式

一 springboot 接口 /**下载模版 * @param response * @throws Exception */ @RequestMapping(value="/downExcel") public void downExcel(HttpServletResponse response)throws Exception{ FileDownload.fileDownload(response, PathUtil.getP...

1411

VESC电调高级调参指南:电机校准与性能优化实战解析

本文详细解析了VESC电调的高级调参方法,包括电机校准与性能优化实战技巧。从基础参数设置到高级机械参数优化,再到动态性能调优,提供了全面的调参指南。特别针对电机类型、功率设置、电池参数配置等关键环节给出实用建议,帮助用户充分发挥VESC电调的性能潜力。

weixin_30772105的博客 196

SpringBoot实现文件下载的几种方式

文章目录1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端2. 将输入流中的数据循环写入到响应输出流中,而不是一次性读取到内存,通过响应输出流输出到前端3. 下载网络文件到本地4. 网络文件获取到服务器后,经服务器处理后响应给前端 1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端 /** * @param path 想要下载的文件的路径 * @param response * @功能描述 下载文件: */ @RequestMapping("/download")

user2025的博客 8万+

DRAM知识整理系列(三):部分时序参数整理

一、tCL-tRCD-tRP-tRAS(第一时序) 内存是根据行和列寻址的,当请求触发后,最初是tRAS(Active to precharge Delay),预充电后,内存才真正开始初始化RAS(Row Address Strobe)。一旦tRAS激活后,RAS开始进行需要数据的寻址。首先是行地址,然后初始化tRCD(RAS to CAS Delay),周期结束,接着通过CAS(Column Address Strobe)访问所需数据的十六进制地址。其中,从CAS开始到CAS结束,就是CAS延迟(即t

不吃鱼的猫的博客 7万+

springboot:各种下载文件的方式

springboot:各种下载文件的方式

拒绝熬夜啊的博客 2万+

【VAE学习笔记】全面通透地理解VAE(Variational Auto Encoder)

完整笔记:http://www.gwylab.com/note-vae.html 李宏毅老师的教程视频:https://www.bilibili.com/video/av15889450/?p=33 —————————————————————————————————   依据李宏毅老师的讲解,我整理了一番VAE的笔记。先简单介绍一下VAE,VAE作为一个生成模型,其基本思路是很容易理解的:把一堆真...

a312863063的博客 14万+

更多 LSTM 变种——应用于 CMAPSS 数据集

本文并模型介绍,只是把一些比较火的技术,像双向注意力机制,自注意力机制这样的比较火的内容,简单的和LSTM堆叠,结果发现效果都不如最基础的,这里作者将本人代码及实现结果,进行展示,给各位想更改LSTM的朋友一些。

2301_77491330的博客 1765

vue+springboot使用文件流实现文件下载

本次将使用vue和springboot通过文件流的方式教大家怎么去实现文件的下载

xc9711的博客 1万+

web渗透学习手册

依据多年的渗透测试项目经验及个人理解,对漏洞分类

渗透之路,攻防之间皆学问 1万+

SpringBoot项目中Resource目录下文件下载及读取的几种方式

一,注意JAVA自动适配Linux与Windows文件路径分隔符 linux文件路径分隔符为 / ,windows的文件路径分隔符为 \ ,在开发项目过程中不确定用户使用何种操作系统,就需要自动适配路径。 目前已知java提供两种方法获取文件路径分割符: public static final String FILE_SEPARATOR = File.separator; //public static final String FILE_SEPARATOR = System.getProp...

在IT技术的世界,天天向上↑ 1万+

PCL 中实现平面模型分割【2026最新版】

RANSAC分割平面。博客长期更新,最近一次更新时间为:2026年5月4日。

点云侠的博客 38万+

别再用第三方黑盒库了!从零手写C#+YOLOv12推理全流程,框位准、可定制、调试快10倍

从零手写YOLO推理框架,不是为了造轮子,而是为了完全掌控代码,工业现场的需求千变万化,第三方黑盒库根本没法满足所有需求。这套代码我已经在东莞长安的3家PCB厂、深圳南山的2家3C电子厂落地了,稳定运行6个月,没有出过任何问题。如果有什么问题或者需要扩展的功能,都可以在评论区交流。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 326

Springboot 下载文件

Springboot下载文件比较简单,以下是代码: 目录结构 FileUtil为文件工具类,里面包括下载的方法,以下为FileUtil的代码: public class FileUtil { public static void download(String filename, HttpServletResponse res) throws IOException { ...

weixin_38168947的博客jAbP)aWAuNkA 5万+

在 RAP 中把业务对象“搬到网口上”:service definition 与 service binding 的全流程、范式与实战

本文解析了SAP ABAP开发中service definition和service binding的关键作用。service definition负责选择要暴露的CDS实体和行为,形成服务模型;而service binding则将服务绑定到具体协议(如OData),生成可访问的端点。两者分离带来三大优势:支持同一模型多重发布、降低环境迁移耦合度、强化安全治理。文章通过预订业务对象的端到端示例,展示了如何从CDS建模到生成Fiori Elements预览。最后以售后工单业务为例,说明这种架构如何支持内外服务

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 390

SpringBoot实现文件下载的几种方式比较。

这里写自定义目录标题SpringBoot实现文件下载的几种方式比较基础版然后这里先引申出进阶版:主动关闭文件流。使用缓存流,边读边写 SpringBoot实现文件下载的几种方式比较 目前,网上一搜SpringBoot环境下载文件。有多种实现方式,大概率出来的会是基础版的,基础版的有几个坑,我这里分别将基础版以及基础版会出现的问题,从而引申各种解决方法。 基础版 话不多说,直接上源码: @RestController public class TestDownload { @Value("${gen.

sfhappy23的博客 7350

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

springboot文件下载

JAVA后台实现文件下载 使用springboot框架,我在本地项目中放了一个文件,然后前台来下载该文件。本人遇到的比较明显的问题: spring获取当前项目路径 String downloadPath = ClassUtils.getDefaultClassLoader().getResource(&quot;&quot;).getPath(); 下载路径中文乱码下载路径中文乱码 解决方法:filePath...

沐秭兮兮丶的博客 1万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

RestTemplate下载文件的3种实现方式

下载文件是一个比较常见的功能,那么在SpringBoot的微服务中,可以使用RestTemplate从第三方下载文件,实现方式有多种,不同的实现方式,优缺点各有不同。

SpringBoot应用最佳实践 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

springboot如何实现文件下载呢?

springboot实现文件下载的方法分享

qq_25073223的博客 5663

SpringBoot实现文件下载的多种方式

【代码】SpringBoot实现文件下载的多种方式。

qq_27480007的博客 5396

springboot各种下载文件的方式汇总

到此这篇关于springboot各种下载文件的文章就介绍到这了,更多相关springboot下载文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

acerren的博客 2084
上一篇: Hexo搭自己的笔记空间
下一篇: Git自动提交脚本
habitplus007
博客等级 码龄8年 8粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值