Spring WebFlux 是一个响应式 Web 框架,它提供了一个非阻塞 Event Loop,可异步处理 I/O 操作。此外,它还使用 和 Reactive Stream Publisher 在订阅时发布数据。
这种响应式方式可帮助应用处理大量请求和数据,而无需分配大量资源。
本文将带你了解如何在 Spring WebFlux 中处理 Multipart 文件上传。
创建一个简单的响应式 Spring Boot 项目,将 Multipart 文件上传到一个目录。
为简单起见,使用项目的根目录来存储文件。在生产中,可以使用 云厂商 OSS、Minio 存储等文件系统。
首先,在 中添加 依赖,以启动 Spring WebFlux 应用:
它提供核心 Spring WebFlux API 和嵌入式 Netty 服务器,用于构建响应式 Web 应用。
另外,还要在 文件中添加 和 数据库依赖:
Spring WebFlux R2DBC 是一个响应式数据库连接器(Database Connector),而 H2 数据库是一个内存数据库。
最后,在 中添加 R2DBC 原生驱动:
这个原生驱动是为H2数据库实现的。
创建 实体类
创建 Repository:
最后,创建 Controller:
示例如下,把 Multipart 文件上传到根目录。但没有把文件名称和扩展名保存到数据库。
首先,创建一个名为 的方法,该方法接受 对象。然后,在每个 对象上调用 方法来传输文件并返回一个 。这将为每个文件传输操作创建一个单独的 ,并将 流扁平化为一个单一的 。
还使用了 方法来明确处理与文件上传相关的异常。如果上传失败,端点会返回错误信息。
注意,在出现异常之前,之前上传的文件可能已经成功传输。在这种情况下,可能需要进行清理,删除错误上传的部分文件。
通过 Postman 上传多个 Multipart 文件来测试端点:

如上,向项目根目录上传了两个文件。端点返回 OK,表明操作已成功完成。
还可以将文件名映射到数据库实体。这样,以后就可以灵活地通过文件 Id 检索文件。
首先,在 文件夹中创建一个 文件,以定义数据库表结构:
如上,创建了一个文件记录表,用于存储上传的文件名及其扩展名。接下来,编写一个配置类,以在启动时初始化 Schema:
另外,还要在 文件中定义数据库 URL:
定义 R2DBC URL 以连接 H2 数据库。为简单起见,数据库没有设置密码。
创建一个 Service 类,实现持久化数据。
如上,在 Service 类中注入 接口,并通过 方法保存实体。
接下来,将 类注入 Controller 类:
最后,编写一个端点,将 Multipart 文件上传到根目录,并将文件名及其扩展名映射到实体类:
如上,创建了一个返回 的端点。它接受 并上传每个文件。然后,它会收集文件名及其扩展名,并将它们映射到 实体。
用 Postman 测试端点:

如上,将两个名为 和 的文件上传到服务器,并返回请求的详细信息。
为了简单起见,这里没有验证文件名、类型和大小。
再实现一个端点,通过 Id 检索存储的文件记录,以查看对应的文件名。
首先,在 Service 类中添加通过 Id 检索文件记录的逻辑:
如上,调用 上的 方法,通过其 id 来检索存储的 。
最后,实现根据 Id 检索文件的端点:
该端点会返回一个包含文件 Id 和文件名的 。
使用 Postman 来测试端点:

如上,成功地返回了对应的文件信息。
本文介绍了如何在 Spring WebFlux 实现 Multipart 文件上传,以及如何把上传文件的文件名称和扩展名存储到数据库。
Ref:
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/11870.html