当前位置: 首页 > news >正文

Springboot项目中minio的使用场景、使用过程(仅供参考)

        在 ​​Spring Boot​​ 项目中,​​MinIO​​ 通常用于 ​​对象存储​​,类似于 AWS S3,可以存储图片、视频、文档等文件。以下是 ​​MinIO 在 Spring Boot 中的常见使用场景​​ 及 ​​详细使用过程​​。


1. MinIO 在 Spring Boot 中的常见使用场景​

场景说明
​图片/文件上传​用户上传头像、商品图片、文档等,存储到 MinIO,返回 URL 给前端展示。
​文件下载​从 MinIO 下载文件(如 PDF、视频、图片等)。
​文件管理​删除、更新、查询文件(如按文件名、前缀搜索)。
​静态资源托管​将静态资源(如 HTML、CSS、JS)存储在 MinIO,并通过 CDN 加速访问。
​备份与归档​存储日志、数据库备份等大文件。

2. Spring Boot 整合 MinIO 的详细步骤​

​2.1 准备工作​

  1. ​安装 MinIO​​(本地或云服务器):

    • ​本地 Docker 运行 MinIO​​:
      docker run -p 9000:9000 -p 9001:9001 --name minio \-e "MINIO_ROOT_USER=minioadmin" \-e "MINIO_ROOT_PASSWORD=minioadmin" \quay.io/minio/minio server /data --console-address ":9001"

  

        访问 MinIO 控制台:http://localhost:9001(默认账号 minioadmin / minioadmin)。

  1. ​创建 Bucket​​(存储桶):

    • 在 MinIO 控制台创建一个 Bucket(如 grass-images)。

2.2 Spring Boot 项目集成 MinIO​

​(1) 添加 MinIO Java SDK 依赖​

在 pom.xml 中添加:

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.5.4</version> <!-- 使用最新版本 -->
</dependency>
(2) 配置 MinIO 连接信息​

在 application.yml 或 application.properties 中配置:

minio:endpoint: http://localhost:9000  # MinIO 服务地址access-key: minioadmin           # MinIO 访问密钥secret-key: minioadmin           # MinIO 密钥bucket-name: grass-images        # 默认 Bucket 名称
(3) 创建 MinIO 配置类​
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MinioConfig {@Value("${minio.endpoint}")private String endpoint;@Value("${minio.access-key}")private String accessKey;@Value("${minio.secret-key}")private String secretKey;@Beanpublic MinioClient minioClient() {return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();}
}
​(4) 创建 MinIO 服务类​
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Item;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service
public class MinioService {@Autowiredprivate MinioClient minioClient;@Value("${minio.bucket-name}")private String bucketName;/*** 上传文件到 MinIO*/public String uploadFile(MultipartFile file, String objectName) throws Exception {// 检查 Bucket 是否存在,不存在则创建boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if (!isExist) {minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}// 上传文件minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(objectName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());// 返回文件访问 URLreturn getFileUrl(objectName);}/*** 获取文件 URL(可设置过期时间)*/public String getFileUrl(String objectName) {// 生成预签名 URL(默认 7 天过期)GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(bucketName).object(objectName).expiry(7, java.util.concurrent.TimeUnit.DAYS).build();try {return minioClient.getPresignedObjectUrl(args);} catch (Exception e) {throw new RuntimeException("获取文件 URL 失败", e);}}/*** 删除文件*/public void deleteFile(String objectName) throws Exception {minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build());}/*** 获取 Bucket 下所有文件*/public List<Map<String, String>> listFiles() throws Exception {List<Map<String, String>> fileList = new ArrayList<>();Iterable<Result<Item>> results = minioClient.listObjects(ListObjectsArgs.builder().bucket(bucketName).recursive(true).build());for (Result<Item> result : results) {Item item = result.get();Map<String, String> fileMap = new HashMap<>();fileMap.put("name", item.objectName());fileList.add(fileMap);}return fileList;}
}
(5) 创建 Controller 接口​
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import java.util.List;
import java.util.Map;@RestController
@RequestMapping("/api/minio")
public class MinioController {@Autowiredprivate MinioService minioService;/*** 上传文件*/@PostMapping("/upload")public Map<String, String> uploadFile(@RequestParam("file") MultipartFile file) {try {String objectName = System.currentTimeMillis() + "_" + file.getOriginalFilename();String fileUrl = minioService.uploadFile(file, objectName);return Map.of("url", fileUrl);} catch (Exception e) {throw new RuntimeException("文件上传失败", e);}}/*** 获取文件 URL*/@GetMapping("/url/{objectName}")public Map<String, String> getFileUrl(@PathVariable String objectName) {String url = minioService.getFileUrl(objectName);return Map.of("url", url);}/*** 删除文件*/@DeleteMapping("/delete/{objectName}")public Map<String, String> deleteFile(@PathVariable String objectName) {try {minioService.deleteFile(objectName);return Map.of("message", "文件删除成功");} catch (Exception e) {throw new RuntimeException("文件删除失败", e);}}/*** 获取所有文件*/@GetMapping("/list")public List<Map<String, String>> listFiles() {try {return minioService.listFiles();} catch (Exception e) {throw new RuntimeException("获取文件列表失败", e);}}
}

2.3 测试 MinIO 文件上传​

  1. ​前端调用上传接口​​(如 POST /api/minio/upload):

    const formData = new FormData();
    formData.append("file", fileInput.files[0]); // fileInput 是 <input type="file"> 元素fetch("http://localhost:8080/api/minio/upload", {method: "POST",body: formData,
    })
    .then(response => response.json())
    .then(data => console.log("文件 URL:", data.url));

    2.​​访问文件 URL​​:返回的 URL 可以直接在浏览器打开,如:

    http://localhost:9000/grass-images/1620000000000_example.jpg

3. 总结​

步骤说明
​1. 安装 MinIO​本地 Docker 或云服务器部署 MinIO。
​2. 创建 Bucket​在 MinIO 控制台创建存储桶(如 grass-images)。
​3. Spring Boot 集成​添加依赖、配置连接信息、创建服务类和 Controller。
​4. 文件上传/下载​使用 MinioClient 进行文件操作。
​5. 测试接口​前端调用上传接口,获取文件 URL 并展示。

这样,你的 Spring Boot 项目就可以轻松使用 MinIO 进行文件存储和管理了! 🚀

 

相关文章:

  • python调用其它程序 os.system os.subprocess
  • 深入浅出Docker
  • 7.2.2_折半查找
  • SQL字符串截取函数全解析:LEFT、RIGHT、SUBSTRING 实战指南
  • 一个简单的德劳内三角剖分实现
  • 湖北理元理律师事务所:债务咨询中的心理支持技术应用
  • IP地址(互联网中设备的唯一逻辑地址标识)
  • ps蒙版介绍
  • EMD算法
  • 移动应用开发专业核心课程以及就业方向
  • Java Smart 系统题库试卷管理模块设计:从需求到开发的实战指南
  • 探秘IBMS系统:能集成哪些建筑子系统实现一体化管理
  • python将图片颜色显示在三维坐标系
  • java报错ncapp生成主子表单据时报错,CarrierRuntimeException
  • 2025年6月|注意力机制|面向精度与推理速度提升的YOLOv8模型结构优化研究:融合ACmix的自研改进方案
  • python怎么读shape文件?
  • RXCDR_CFG参数选择
  • 第23讲、Odoo18 邮件系统整体架构
  • nonlocal 与global关键字
  • AIGC的产品设计演进:从工具到协作者
  • 课程推广/济南seo全网营销
  • 网站建设公司广告语/品牌设计公司排名前十强
  • 做视频赚钱的网站/整站优化关键词推广
  • 物流网站建设重要性/微信推广多少钱一次
  • 设计方案表网站名称/代哥seo
  • 天津网站建设推广/武汉百度推广电话