iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >SpringBoot下载文件的正确方式~
  • 579
分享到

SpringBoot下载文件的正确方式~

springbootjavaspring 2023-08-23 19:08:41 579人浏览 安东尼
摘要

Spring Boot 配合 axiOS 实现文件下载功能 前言比较一般的解法分析原因 正确解法 前言 最近遇到一个奇怪的需求,前端通过post请求下载压缩文件,同时会传给后端一些数据,用于生成压缩包。此时后端接口就不仅仅是

前言

最近遇到一个奇怪的需求,前端通过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统一处理:

@RestControllerAdvicepublic class ExceptionAdvice {    private static final Logger logger = LoggerFactory.getLogger(ExceptionAdvice.class);        @ExceptionHandler(value = BindException.class)    public ResponseEntity<Result<Object>> handleValidateException(BindException bindException) {        logger.error("数据绑定异常,{}", bindException.getMessage(), bindException);        return of(HttpStatus.BAD_REQUEST, "数据绑定异常");    }        @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());    }        @ExceptionHandler(value = OptErrorException.class)    public ResponseEntity<Result<Object>> handleOptErrorException(OptErrorException exception) {        return of(HttpStatus.INTERNAL_SERVER_ERROR, exception.getOptMsg());    }        @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, "服务器内部未知错误");    }}

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

来源地址:https://blog.csdn.net/dubulingbo/article/details/129641709

--结束END--

本文标题: SpringBoot下载文件的正确方式~

本文链接: https://www.lsjlt.com/news/378832.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringBoot下载文件的正确方式~
    Spring Boot 配合 axios 实现文件下载功能 前言比较一般的解法分析原因 正确解法 前言 最近遇到一个奇怪的需求,前端通过post请求下载压缩文件,同时会传给后端一些数据,用于生成压缩包。此时后端接口就不仅仅是...
    99+
    2023-08-23
    spring boot java spring
  • Springboot导出文件,前端下载文件方式
    Springboot导出文件,前端下载文件 后端代码 可以把请求设置为post,我这里是Get @RequestMapping(value = "/download", met...
    99+
    2024-04-02
  • springboot各种下载文件的方式汇总
    目录一、使用response输出流下载二、使用ResponseEntity三、注意总结一、使用response输出流下载 注意第一种方式返回值必须为void @GetMapping(...
    99+
    2022-11-13
    springboot下载文件 springboot下载文件到本地 Springboot下载文件
  • SpringBoot中下载文件的方式有哪些
    这篇文章将为大家详细讲解有关SpringBoot中下载文件的方式有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。文件来源这里还是以GridFS为例,主要演示的还是从mongo下载下来的文件,如果是本地...
    99+
    2023-06-21
  • Golang中正确的文件删除方式
    在日常编程工作中,处理文件是一个常见的操作,而删除文件也是经常会用到的功能之一。在Golang中,删除文件同样是一个常见的操作,但是需要一些注意事项和最佳实践方案来确保操作的安全和正确...
    99+
    2024-02-26
    最佳方法 文件删除 golang实践
  • SpringBoot实现文件下载功能的方式分享
    1. 将文件以流的形式一次性读取到内存,通过响应输出流输出到前端 @RequestMapping("/download") public void download(String ...
    99+
    2023-03-23
    SpringBoot实现文件下载 SpringBoot文件下载 SpringBoot下载
  • Go语言文件关闭的正确方式
    标题:Go语言文件关闭的正确方式 在Go语言中,文件操作是非常常见的操作之一,然而在处理文件时正确关闭文件是非常重要的,否则可能会导致资源泄露或者文件操作异常。本文将介绍在Go语言中关...
    99+
    2024-02-28
    go语言 关闭文件 正确方式
  • 如何正确的使用Springboot配置文件
    这篇文章给大家介绍如何正确的使用Springboot配置文件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如果使用IDEA创建Springboot项目,默认会在resource目录下创建application.prop...
    99+
    2023-05-31
    springboot bo
  • PHP 文件存储:如何正确加载文件?
    PHP 文件存储是 Web 开发中不可避免的一部分。在 PHP 中,我们使用文件函数来读取和写入文件。但是,如果我们没有正确地加载文件,可能会导致代码运行失败或安全漏洞。本文将介绍如何正确加载文件,以及如何安全地操作文件。 使用绝对路径...
    99+
    2023-09-05
    文件 存储 load
  • Java下载文件的方式有哪些
    这篇文章给大家分享的是有关Java下载文件的方式有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。以流的方式下载public HttpServletResponse download(Str...
    99+
    2023-06-22
  • springboot读取resources下文件的方式详解
    项目中很多时候需要读取自定义配置文件,本地开发工具怎么写都成功但是部署到服务其上就出现问题, 异常BOOT-INF/classes!/config.xml (文件名、目录名或卷标语法...
    99+
    2024-04-02
  • Linux下怎么正确解压rar文件
    这篇文章主要讲解了“Linux下怎么正确解压rar文件”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Linux下怎么正确解压rar文件”吧!安装# tar -zxvf rarlinux-x6...
    99+
    2023-06-27
  • java实现文件下载的两种方式
    本文实例为大家分享了java实现文件下载的具体代码,供大家参考,具体内容如下public HttpServletResponse download(String path, HttpServletResponse response) { ...
    99+
    2023-05-30
    java 文件下载 ava
  • Java下载文件的4种方式总结
    1. 使用URL类的openStream()方法:这是最基本的下载文件的方式。通过URL.openStream()方法,可以获取到文件的输入流,然后使用输入流的read()方法来读取文件内容,并将其写入到本地文件中。2. 使用URLCo...
    99+
    2023-08-09
    Java
  • python 下载文件的几种方式分享
    目录1 、一般同步下载2、 使用流式请求,requests.get方法的stream3 、异步下载文件4、 异步拆分下载文件5、注意1 、一般同步下载 示例代码: import...
    99+
    2024-04-02
  • SpringBoot下载Excel文件时,报错文件损坏的解决方案
    SpringBoot下载Excel文件文件损坏 我把模板文件放在了resources目录下 maven插件打包项目的时候,默认会压缩resources目录下的文件。 服务器读取的文...
    99+
    2024-04-02
  • RestTemplate文件上传下载与大文件流式下载
    目录一、文件上传二、文件下载三、大文件下载本文是精讲RestTemplate第6篇,前篇的blog访问地址如下: RestTemplate在Spring或非Spring环境下使用精讲...
    99+
    2024-04-02
  • Java实现下载文件的6种方式
    1. 使用URL类的openStream()方法下载文件:```javaURL url = new URL(fileUrl);Inp...
    99+
    2023-08-08
    Java
  • 关于SpringBoot大文件RestTemplate下载解决方案
    近期基于项目上使用到的RestTemplate下载文件流,遇到1G以上的大文件,下载需要3-4分钟,因为调用API接口没有做分片与多线程, 文件流全部采用同步方式加载,性能很慢。最近...
    99+
    2024-04-02
  • vue下载文件以及文件重命名方式
    目录vue下载文件及文件重命名vue项目如何改名vue下载文件及文件重命名 http Content-type对照表大家自行百度 export function downFile(...
    99+
    2022-11-13
    vue下载文件 vue文件重命名 vue文件命名
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作