Spring Web文件上传下载注意点

server/2024/12/16 20:37:12/

我们使用如下的Controller来上传下载文件:

java">@RestController
@RequestMapping("/hello")
@Slf4j
public class FileController {@GetMapping("/upload")public void uploadFile(@RequestParam("file") MultipartFile file) {log.info("{} uploaded, {} bytes", file.getOriginalFilename(), file.getSize());}@GetMapping("/download")public void downloadFile(HttpServletResponse response) {List<TestVO> voList = new ArrayList<>();for (int i = 0; i < 100; i++) {TestVO vo = new TestVO();vo.setId(String.valueOf(i));vo.setName(i + "name");voList.add(vo);}try {response.setCharacterEncoding(StandardCharsets.UTF_8.name());response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);response.setHeader(HttpHeaders.CONTENT_DISPOSITION, String.format("attachment; filename=%s", "test.xlsx"));EasyExcel.write(response.getOutputStream()).sheet(0).doWrite(voList);// OutputStream outputStream = response.getOutputStream();// easyexcel会flush,这里不用// outputStream.flush();log.info("response: {}", JsonUtil.toJson(response));} catch (IOException e) {log.error("下载失败:e:", e);throw new RuntimeException("文件下载失败");}}
}

Upload

当我们调用upload接口分别上传一个15MB和8MB的文件时会出现以下两个报错:

// 上传15MB文件时
org.apache.tomcat.util.http.fileupload.impl.SizeLimitExceededException: the request was rejected because its size (15579467) exceeds the configured maximum (10485760)// 上传8MB的文件时
org.apache.tomcat.util.http.fileupload.impl.FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.

原来SpringBoot会对tomcat上传form/multipart的大小做限制,multipart可一次上传多个文件,
默认每个文件大小不超过1MB,文件总大小不超过10MB。参见如下默认配置:

java">@ConfigurationProperties(prefix = "spring.servlet.multipart", ignoreUnknownFields = false)
public class MultipartProperties {// 默认开启private boolean enabled = true;// 默认1MBprivate DataSize maxFileSize = DataSize.ofMegabytes(1);// 默认10MBprivate DataSize maxRequestSize = DataSize.ofMegabytes(10);...
}

可通过配置文件设置修改默认配置:

spring.servlet.multipart.max-request-size=200MB
spring.servlet.multipart.max-file-size=200MB

也可注入自定义配置类Bean:

java">    @Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setMaxFileSize(DataSize.ofMegabytes(200));factory.setMaxRequestSize(DataSize.ofMegabytes(200));return factory.createMultipartConfig();}

但是上面的配置方式无法动态变化,只能修改代码重新上线。此时可继承MultipartConfigElement重写get方法配合配置中心达到动态配置的目的,代码如下:

java">@Component
public class DynamicMultipartConfigElement extends MultipartConfigElement {public DynamicMultipartConfigElement() {super("");}@Overridepublic long getMaxFileSize() {// 从配置中心获取最新配置return super.getMaxFileSize();}@Overridepublic long getMaxRequestSize() {// // 从配置中心获取最新配置return super.getMaxRequestSize();}
}

Download

运行以上下载文件的代码,发现会报错:

com.fasterxml.jackson.databind.JsonMappingException: getOutputStream() has already been called for this response (through reference chain: org.apache.catalina.connector.ResponseFacade["writer"])

看提示发现是在outputSteam#flush完再次通过打印日志的JsonUtil.toJson操作调用了outputStream,而stream只能被消费一次。
通常打印日志是通过AOP注解实现,使用时不会关注注解切面的内部逻辑,如果在切面执行完再调用打印入参的response则会报此错。
当然,打印日志即使报错也不该影响正常的业务逻辑,所以在日志AOP切面处理时要对打日志的逻辑加上try-catch


http://www.ppmy.cn/server/150721.html

相关文章

Linux 支持多个spi-nor flash

1. 需求 通常在嵌入式开发过程中可能会遇到需要再同一个SPI总线上挂载多个spi nor flash才能满足存储需求。 2. 技术简介 对于spi-nor flash驱动通常不需要驱动开发人员手搓&#xff0c;一般内核会有一套固定的驱动&#xff0c;而且走的是内核的MTD子系统那一套&#xff0c;市…

开发EDA工具常用的三方开源

EDA软件是制造芯片重要工具&#xff0c;是现在举国的大难题。这个工具难在哪里&#xff0c;几句话说不清&#xff0c;但它确实也有一些非常通用的功能&#xff0c;这些功能依赖一些成熟的轮子&#xff0c;这些轮子&#xff0c;就是三方的开源项目&#xff0c;下面列举一些常用的…

前端页面导出word

html-docx-js bug: vite使用html-docx.js会报错&#xff0c;点击下载上方文件替换即可 正文 npm install html-docx-js -S npm install file-saver -S<template><div id"managerReport">word内容......</div> </template><script>&l…

HTTP域RPC

HTTP&#xff08;超文本传输协议&#xff09;和RPC&#xff08;远程过程调用&#xff09;是两种不同的通信协议&#xff0c;它们在网络通信中扮演着重要的角色。以下是HTTP和RPC的区别和关系的表格展示&#xff1a; 特性HTTPRPC定义一种用于传输超文本的应用层协议&#xff0c…

文件上传之黑名单检测

一般情况下&#xff0c;代码文件里会有一个数组或者列表&#xff0c;该数组或者列表里会包含一些非法的字符或者字符串&#xff0c;当数据包中含有符合该列表的字符串时&#xff0c;即认定该数据包是非法的。 ​​ 一.如何判断是否为黑名单检测 黑名单是有限的&#xff0c;可以…

Python 3 和 JSON 数据格式

Python 3 和 JSON 数据格式 Python 3 是一种广泛使用的编程语言&#xff0c;以其简洁明了的语法和强大的功能而闻名。JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。…

AIGC 013-CoT用思维链挖掘自回归语言模型的潜在能力

AIGC 013-CoT用思维链挖掘自回归语言模型的潜在能力 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 纯自回归式语言模型&#xff0c;本来并不具备优秀推理能力&#xff0c;特别是在数学问题的推理。但是现在的生成模型是能实现一些数学的推理的。研究者认为当模型足够大…

深入理解 XPath:XML 和 HTML 文档的利器

XPath&#xff08;XML Path Language&#xff09;是一种用于在 XML 和 HTML 文档中定位节点的语言。它常用于 XML 解析、Web 数据抓取&#xff08;如 Selenium 或 Scrapy&#xff09;以及配置文件解析。本文将带你深入了解 XPath 的语法、功能及其在实际中的应用。 目录 一、什…