找回密码
 立即注册
查看: 388|回复: 0

[后端] Spring Boot轻松整合Minio实现文件上传下载功能

[复制链接]

224

主题

0

回帖

773

积分

高级会员

积分
773
发表于 2024-6-13 13:48:11 | 显示全部楼层 |阅读模式
本帖最后由 御坂主机 于 2024-6-13 14:47 编辑

1. 引言

在现代Web应用中,文件上传和下载是常见的功能需求。Spring Boot作为一个流行的java框架,提供了简洁的方式来实现这些功能。而Minio是一个高性能的对象存储服务器,兼容Amazon S3 API,非常适合用于文件存储。本文将介绍如何通过Spring Boot轻松整合Minio实现文件的上传和下载功能。

1.1 准备工作

在开始实际编码之前,我们需要准备以下环境和工具:

(1) Java 8或更高版本
(2) Spring Boot 2.x
(3) Minio服务器
(4) 一个合适的IDE,如IntelliJ IDEA

1.2 Minio服务器配置

首先,需要在本地或远程启动一个Minio服务器。可以通过以下命令启动Minio:

  1. minio server /data
复制代码


启动后,Minio服务器默认运行在9000端口,可以通过http://localhost:9000访问其Web界面。初始启动时会提供访问密钥和秘密密钥,注意保存这两个密钥,后续Spring Boot配置中会使用到。

2. Spring Boot项目配置

2.1 创建Spring Boot项目

可以通过Spring Initializr(https://start.spring.io/)快速生成一个Spring Boot项目,选择以下依赖:

(1) Spring Web
(2) Lombok
(3) Spring Boot DevTools

下载并解压生成的项目,并使用IDE打开。

2.2 添加Minio依赖

在pom.xml文件中添加Minio客户端依赖:

  1. <dependency>
  2.     <groupId>io.minio</groupId>
  3.     <artifactId>minio</artifactId>
  4.     <version>8.3.0</version>
  5. </dependency>
复制代码


2.3 配置文件

在src/main/resources目录下的application.properties文件中添加Minio配置:

  1. minio.url=http://localhost:9000
  2. minio.access-key=your-access-key
  3. minio.secret-key=your-secret-key
  4. minio.bucket-name=your-bucket-name
复制代码


3. 实现文件上传和下载功能

3.1 配置类

首先,创建一个配置类用于配置Minio客户端:

  1. package com.example.demo.config;

  2. import io.minio.MinioClient;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;

  6. @Configuration
  7. public class MinioConfig {

  8.     @Value("${minio.url}")
  9.     private String minioUrl;

  10.     @Value("${minio.access-key}")
  11.     private String accessKey;

  12.     @Value("${minio.secret-key}")
  13.     private String secretKey;

  14.     @Bean
  15.     public MinioClient minioClient() {
  16.         return MinioClient.builder()
  17.                           .endpoint(minioUrl)
  18.                           .credentials(accessKey, secretKey)
  19.                           .build();
  20.     }
  21. }
复制代码


3.2 服务类

接下来,创建一个服务类用于处理文件上传和下载逻辑:

  1. package com.example.demo.service;

  2. import io.minio.MinioClient;
  3. import io.minio.PutObjectArgs;
  4. import io.minio.GetObjectArgs;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.stereotype.Service;
  7. import org.springframework.web.multipart.MultipartFile;

  8. import java.io.InputStream;

  9. @Service
  10. public class MinioService {

  11.     @Autowired
  12.     private MinioClient minioClient;

  13.     @Value("${minio.bucket-name}")
  14.     private String bucketName;

  15.     public String uploadFile(MultipartFile file) throws Exception {
  16.         String fileName = file.getOriginalFilename();
  17.         InputStream inputStream = file.getInputStream();
  18.         minioClient.putObject(
  19.             PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(
  20.                 inputStream, inputStream.available(), -1)
  21.                 .contentType(file.getContentType())
  22.                 .build());
  23.         return fileName;
  24.     }

  25.     public InputStream downloadFile(String fileName) throws Exception {
  26.         return minioClient.getObject(
  27.             GetObjectArgs.builder()
  28.                          .bucket(bucketName)
  29.                          .object(fileName)
  30.                          .build());
  31.     }
  32. }
复制代码


3.3 控制器类

最后,创建一个控制器类,提供文件上传和下载的接口:

  1. package com.example.demo.controller;

  2. import com.example.demo.service.MinioService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.http.HttpHeaders;
  5. import org.springframework.http.MediaType;
  6. import org.springframework.http.ResponseEntity;
  7. import org.springframework.web.bind.annotation.*;
  8. import org.springframework.web.multipart.MultipartFile;

  9. import java.io.InputStream;

  10. @RestController
  11. @RequestMapping("/files")
  12. public class MinioController {

  13.     @Autowired
  14.     private MinioService minioService;

  15.     @PostMapping("/upload")
  16.     public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file) {
  17.         try {
  18.             String fileName = minioService.uploadFile(file);
  19.             return ResponseEntity.ok(fileName);
  20.         } catch (Exception e) {
  21.             return ResponseEntity.status(500).body("Error uploading file: " + e.getMessage());
  22.         }
  23.     }

  24.     @GetMapping("/download/{fileName}")
  25.     public ResponseEntity<InputStreamResource> downloadFile(@PathVariable String fileName) {
  26.         try {
  27.             InputStream inputStream = minioService.downloadFile(fileName);
  28.             return ResponseEntity.ok()
  29.                 .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="" + fileName + """)
  30.                 .contentType(MediaType.APPLICATION_OCTET_STREAM)
  31.                 .body(new InputStreamResource(inputStream));
  32.         } catch (Exception e) {
  33.             return ResponseEntity.status(500).body(null);
  34.         }
  35.     }
  36. }
复制代码


4. 结论

通过以上步骤,我们成功地整合了Spring Boot和Minio,实现了文件的上传和下载功能。这种组合不仅简单高效,而且非常适合现代Web应用的开发需求。希望本文对你有所帮助,让你在项目中能够更轻松地实现文件存储功能。




------------------------------------------------------------------------------------------------------------------------------------------

========  御 坂 主 机  ========

>> VPS主机 服务器 前沿资讯 行业发布 技术杂谈 <<

>> 推广/合作/找我玩  TG号 : @Misaka_Offical <<

-------------------------------------------------------------------------------------------------------------------------------------------

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

联系站长|Archiver|手机版|小黑屋|主机论坛

GMT+8, 2025-4-4 13:53 , Processed in 0.062968 second(s), 24 queries .

Powered by 主机论坛 HostSsss.Com

HostSsss.Com

快速回复 返回顶部 返回列表