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

        在现代的微服务架构中,文件上传与下载是常见的需求,尤其是在需要处理大量文件数据的系统中。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: 10MB
      max-request-size: 10MB

3.编写Service和Controller层

        3.1.创建文件上传方法

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

@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文档

@RestController
@RequestMapping("/api/auth/order")
@Tag(name = "订单管理")
public class OrderController {

    private final OrderService orderService;

    @Autowired
    public 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.创建文件下载方法

@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.创建文件下载接口

@RestController
@RequestMapping("/api/auth/order")
@Tag(name = "订单管理")
public class OrderController {

    private final OrderService orderService;

    @Autowired
    public 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接口测试工具上调试的结果:

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

1.安装JDK 在进行SpringCloud微服务架构环境部署之前,需要先安装Java Development Kit(JDK),可以从Oracle官网下载最新版本的JDK,然后按照提示安装即可。 2.安装Eclipse Eclipse是一款开源的集成开发环境(IDE),可以用来开发Java应用程序。在进行SpringCloud微服务架构环境部署之前,需要先安装Eclipse。 可以从Eclipse官网下载最新版本的Eclipse,然后按照提示安装即可。 3.安装Maven Maven是一个构建工具,可以用来自动化构建、测试和部署Java应用程序。在进行SpringCloud微服务架构环境部署之前,需要先安装Maven。 可以从Maven官网下载最新版本的Maven,然后按照提示安装即可。 4.安装Docker Docker是一款开源的容器化平台,可以将应用程序打包成容器,方便部署和管理。在进行SpringCloud微服务架构环境部署之前,需要先安装Docker。 可以从Docker官网下载最新版本的Docker,然后按照提示安装即可。 5.安装Kubernetes Kubernetes是一个开源的容器编排系统,可以用来部署、管理和扩展容器化应用程序。在进行SpringCloud微服务架构环境部署之前,需要先安装Kubernetes。 可以从Kubernetes官网下载最新版本的Kubernetes,然后按照提示安装即可。 6.部署SpringCloud微服务架构 在完成以上步骤之后,就可以开始部署SpringCloud微服务架构了。具体步骤如下: (1)创建一个SpringBoot项目,并在pom.xml文件中添加所需的SpringCloud依赖。 (2)在src/main/resources目录下创建一个application.yml配置文件,并配置SpringCloud相关的参数。 (3)使用Maven打包应用程序,并将生成的jar文件上传到Docker镜像仓库。 (4)使用Kubernetes创建一个Deployment对象,用来部署应用程序的容器。 (5)使用Kubernetes创建一个Service对象,用来暴露应用程序的服务。 (6)使用Kubernetes创建一个Ingress对象,用来路由应用程序的请求。 (7)完成以上步骤后,就可以访问应用程序了。 7.总结 以上就是SpringCloud微服务架构环境部署的详细步骤。需要注意的是,在进行部署之前,需要先熟悉Docker和Kubernetes的基本概念和操作方法,以便能够顺利完成部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洛*璃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值