Spring Cloud微服务项目文件上传/下载

embedded/2024/12/23 4:33:25/

        在现代的微服务架构中,文件上传与下载是常见的需求,尤其是在需要处理大量文件数据的系统中。Spring Cloud 提供了灵活的工具和组件,使得在微服务中实现文件上传和下载变得高效而简便。

        本文博主将详细介绍如何在 Spring Cloud 微服务项目中实现文件上传和下载功能。

前置条件

        在开始本文前,博主希望你已经初步创建了一个Spring Cloud微服务项目:Spring Cloud微服务项目创建请参考:Spring Cloud微服务项目搭建

1.添加依赖

        在子模块的 pom.xml 中添加必要的依赖(博主这里是 order 模块):

<!-- oder 模块 pom.xml 配置文件 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.配置上传文件的大小限制

        在 application.properties 或 application.yml 中配置文件上传的大小限制:

# application.properties 配置文件spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB

# application.yml 配置文件spring:servlet:multipart:max-file-size: 10MBmax-request-size: 10MB

3.编写Service和Controller层

        3.1.创建文件上传方法

博主这里将MyBati 跟 MyBatis-Plus 二者结合一起使用,详情请参考:Spring Cloud微服务项目集成MyBatis

java">@Service
public class OrderService extends ServiceImpl<OrderMapper, OrderInfoModel> {/*** 文件上传*/public String uploadFile(MultipartFile file) {if (file.isEmpty()) {return "上传文件不能为空!";} else {try {// 创建目录String uploadDir = "files/";File dir = new File(uploadDir);if (!dir.exists()) {boolean created = dir.mkdirs();if (!created) {return "Failed to create upload directory.";}}// 获取文件名String fileName = file.getOriginalFilename();Path path = Paths.get(uploadDir + fileName);// 将文件保存到目标路径Files.write(path, file.getBytes());// 返回 文件存储路径return "http://localhost:8000/api/auth/files/" + fileName;} catch (IOException e) {throw new RuntimeException(e);}}}
}

        3.2.编写文件上传接口

这里Swagger接口文档请参考:Spring Cloud微服务项目聚合Swagger文档

java">@RestController
@RequestMapping("/api/auth/order")
@Tag(name = "订单管理")
public class OrderController {private final OrderService orderService;@Autowiredpublic OrderController(OrderService orderService) {this.orderService = orderService;}@PostMapping("/uploadFile")@Operation(summary = "文件上传", parameters = {@Parameter(name = "Authorization",description = "TOKEN",in = ParameterIn.HEADER,required = true,schema = @Schema(type = "string"))})public String uploadFile(@RequestParam("file") MultipartFile file) {return orderService.uploadFile(file);}
}

        3.3.创建文件下载方法

java">@Service
public class OrderService extends ServiceImpl<OrderMapper, OrderInfoModel> {/*** 文件上传*/public String uploadFile(MultipartFile file) {if (file.isEmpty()) {return "上传文件不能为空!";} else {try {// 创建目录String uploadDir = "files/";File dir = new File(uploadDir);if (!dir.exists()) {boolean created = dir.mkdirs();if (!created) {return "Failed to create upload directory.";}}// 获取文件名String fileName = file.getOriginalFilename();Path path = Paths.get(uploadDir + fileName);// 将文件保存到目标路径Files.write(path, file.getBytes());// 返回 文件存储路径return "http://localhost:8000/api/auth/files/" + fileName;} catch (IOException e) {throw new RuntimeException(e);}}}/*** 文件下载*/public ResponseEntity<Resource> downloadFile(String fileName) {try {// 构建文件路径Path filePath = fileStorageLocation.resolve(fileName).normalize();Resource resource = new UrlResource(filePath.toUri());// 检查文件是否存在if (!resource.exists()) {return ResponseEntity.notFound().build();}// 设置响应头,触发下载String contentType = "application/octet-stream"; // 默认的 MIME 类型return ResponseEntity.ok().contentType(org.springframework.http.MediaType.parseMediaType(contentType)).header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + resource.getFilename() + "\"").body(resource);} catch (Exception e) {return ResponseEntity.status(500).build();}
}

        3.4.创建文件下载接口

java">@RestController
@RequestMapping("/api/auth/order")
@Tag(name = "订单管理")
public class OrderController {private final OrderService orderService;@Autowiredpublic OrderController(OrderService orderService) {this.orderService = orderService;}@PostMapping("/uploadFile")@Operation(summary = "文件上传", parameters = {@Parameter(name = "Authorization",description = "TOKEN",in = ParameterIn.HEADER,required = true,schema = @Schema(type = "string"))})public String uploadFile(@RequestParam("file") MultipartFile file) {return orderService.uploadFile(file);}@GetMapping("/download/{fileName:.+}")@Operation(summary = "文件下载", parameters = {@Parameter(name = "Authorization",description = "TOKEN",in = ParameterIn.HEADER,required = true,schema = @Schema(type = "string"))})public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {return orderService.downloadFile(fileName);}
}

4.测试

        4.1.文件上传测试

如果使用了Swagger 接口文档,那么直接在浏览器地址栏键入:

http://localhost:8000/doc.html

        找到order服务中的文件上传接口,点击 选择文件 ==> 发送:

        如果不出意外,你将会看到上面这个结构,我们拿到了后端返回的文件存储地址

        4.2.文件下载测试

         找到文件下载接口,点击 调试 ==> 输入我们要下载的文件名 ==> 点击发送:

        当我们能够拿到这样的图片的时候,表示接口已经接通了,不过这里Swagger似乎没有提供下载的按钮,下面是博主在ApiFox接口测试工具上调试的结果:

点击 下载 按钮后,文件将会被保存到自己的电脑上 


http://www.ppmy.cn/embedded/93387.html

相关文章

操作ArkTS页面跳转及路由相关心得

本文为JS老狗原创。 当前端不得不关注的点&#xff1a;路由&#xff0c;今天聊一聊鸿蒙相关的一点心得。 总体上套路不意外&#xff0c;基本就是&#xff08;尤其是Web&#xff09;前端那些事&#xff1a;维护路由表、跳转带参数、历史堆栈操作&#xff0c;等等。 历史原因&…

java之贪婪爬取和非贪婪爬取

public class RegexDemo6 {public static void main(String[] args) {String str"java自从95年问世以来,abbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaa" " 经历了很多版本,目前企业中用的最多是java8和java11,""因为这俩个是长期版本,下一个长期支持版本是java…

使用Unity开发编辑系统时复制物体的一些细节问题

首先是复制一个GameObject时组件中的变量内容的复制问题&#xff0c;这个在Unity复制对象时让私有变量也被复制的简单方法这篇博客里面做了说明&#xff0c;但是其实还有一个问题&#xff0c;就是有些时候需要被复制的物体在刚创建出来的时候需要自动执行一些操作&#xff0c;这…

数据库基础知识

数据库基础知识 主流的数据库连接MySQL理解mysql和mysqld和数据库简单对数据库操作MySQL构架SQL分类存储引擎总结 主流的数据库 SQL Sever&#xff1a; 微软的产品&#xff0c;.Net程序员的最爱&#xff0c;中大型项目。Oracle&#xff1a; 甲骨文产品&#xff0c;适合大型项目…

sqli靶场复现(1-8关)

目录 1.sqli-labs第二关 1.判断是否存在sql注入 1.1你输入数字值的ID作为参数&#xff0c;我们输入?id1 1.2在数据库可以查看到users下的对应内容 2.联合注入 2.1首先知道表格有几列&#xff0c;如果报错就是超过列数&#xff0c;如果显示正常就是没有超出列数。 2.2得…

网络安全入门教程(非常详细)从零基础入门到精通!

一、引言 在当今高度数字化的时代&#xff0c;网络如同一张无形的大网&#xff0c;将世界紧密连接在一起。然而&#xff0c;在这看似便捷与美好的背后&#xff0c;却隐藏着无数的风险与威胁。网络安全已成为捍卫个人隐私、企业机密乃至国家安全的关键防线。如果您怀揣着对网络世…

LeeCode Practice Journal | Day37_DP05

完全背包 有N件物品和一个容量为W的背包&#xff0c;第 i 件物品的重量是weight[ i ]&#xff0c;价值为value[ i ]&#xff0c;每件物品都有无限个&#xff0c;求解使用背包物品价值总和达到最大的装包方案 二维 static int CompleteKnapsack2D(int[] weights, int[] value…

django项目中初始化数据库数据时的离线脚本

django初始化数据库数据时的离线脚本 """ 要想通过ORM操作数据库&#xff0c;必须要先启动django pycharm会自动scripts文件夹添加的sys.path&#xff0c;但是在服务器部署时自己手动添加&#xff0c; """import os import sysimport django# 部…