SpringBoot3.X 整合 MinIO 存儲(chǔ)原生方案
SpringBoot3.X整合MinIO存儲(chǔ)原生方案:從環(huán)境搭建到實(shí)戰(zhàn)開(kāi)發(fā)
一、前言:為什么選擇MinIO?
在分布式存儲(chǔ)領(lǐng)域,MinIO作為一款高性能的對(duì)象存儲(chǔ)服務(wù),憑借兼容S3 API、輕量級(jí)部署、支持分布式集群等特性,成為企業(yè)級(jí)文件存儲(chǔ)的熱門選擇。尤其在SpringBoot生態(tài)中,通過(guò)原生SDK整合MinIO可以快速實(shí)現(xiàn)文件的上傳、下載、刪除等功能,適用于云存儲(chǔ)、大數(shù)據(jù)場(chǎng)景、內(nèi)容管理系統(tǒng)等多種業(yè)務(wù)場(chǎng)景。
本文將基于SpringBoot3.X版本,從零開(kāi)始構(gòu)建MinIO文件存儲(chǔ)方案,涵蓋環(huán)境準(zhǔn)備、依賴配置、核心功能開(kāi)發(fā)、進(jìn)階特性及問(wèn)題排查,幫助開(kāi)發(fā)者快速掌握原生整合方案。
二、環(huán)境準(zhǔn)備
1. 基礎(chǔ)環(huán)境清單
- JDK 17+(SpringBoot3.X最低要求)
- Maven 3.6+
- MinIO服務(wù)(本文使用虛擬機(jī)部署的MinIO)
- IDE:IntelliJ IDEA 2024.3
2. MinIO服務(wù)部署
如果沒(méi)有現(xiàn)成的MinIO服務(wù),可通過(guò)Docker快速部署本地測(cè)試環(huán)境:
# 拉取鏡像 mkdir -p /minio/data chmod 777 /minio/data docker run \-d --restart=always \--name minio \--hostname minio-server \ -p 9000:9000 \-p 9001:9001 \-v /minio/data:/bitnami/minio/data \-e MINIO_ROOT_USER="minio_root" \-e MINIO_ROOT_PASSWORD="minio_123456" \-e MINIO_DEFAULT_BUCKETS="bucket" \-e "MINIO_SERVER_URL=http://192.168.229.128:9000" \ bitnami/minio:2023.12.7
啟動(dòng)后訪問(wèn)http://192.168.229.128:9001,使用賬號(hào)(minio_root)密碼(minio_123456)登錄控制臺(tái),創(chuàng)建本文所需的ai-pan桶(Bucket)。
注意ip需要改成自己的,訪問(wèn)頁(yè)面如下,輸入賬號(hào)密碼,點(diǎn)擊login

成功進(jìn)入頁(yè)面之后,創(chuàng)建我們的Bucket


三、項(xiàng)目初始化與依賴配置
1. 創(chuàng)建SpringBoot項(xiàng)目
通過(guò)Spring Initializr創(chuàng)建項(xiàng)目,選擇以下依賴:
- Spring Web(用于接口開(kāi)發(fā))
- Lombok(簡(jiǎn)化實(shí)體類代碼)
2. 核心依賴引入
在pom.xml中添加MinIO SDK依賴(注意版本兼容性,8.3.7兼容SpringBoot3):
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.3.7</version> </dependency> <!-- 工具類依賴(非必需,用于文件路徑處理) --> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.8.20</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> </dependency>
四、配置詳解
1. 核心配置文件(application.yml)
# MinIO核心配置 minio: endpoint: http://192.168.229.128:9000 # API訪問(wèn)地址 access-key: minio_root # 訪問(wèn)密鑰 access-secret: minio_123456 # 密鑰密碼 bucket-name: ai-pan # 創(chuàng)建的桶名稱
2. MinIO配置類
import io.minio.MinioClient;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
@Value("endpoint")
private String endpoint;
@Value("access-key")
private String accessKey;
@Value("access-secret")
private String accessSecret;
@Value("bucket-name")
private String bucketName;
// 預(yù)簽名url過(guò)期時(shí)間(ms)
private Long PRE_SIGN_URL_EXPIRE = 60 * 10 * 1000L;
@Bean
public MinioClient getMinioClient() {
return MinioClient.builder()
.endpoint(endpoint)
.credentials(accessKey, accessSecret)
.build();
}
}五、核心功能開(kāi)發(fā)
1. 工具類:文件路徑生成
public class CommonUtil {
public static String getFilePath(String fileName) {
String suffix = getFileSuffix(fileName);
// ?成?件在存儲(chǔ)桶中的唯?鍵
return StrUtil.format("{}/{}/{}/{}.{}", DateUtil.thisYear(),
DateUtil.thisMonth() + 1,DateUtil.thisDayOfMonth(), IdUtil.randomUUID(), suffix);
}
}2. 控制器(TestController)
@RestController
@RequestMapping("/api/test/v1")
public class TestController {
@Autowired
private MinioConfig minioConfig;
@Autowired
private MinioClient minioClient;
@PostMapping("/upload")
public JsonData upload(@RequestParam("file") MultipartFile file) {
String filename = CommonUtil.getFilePath(file.getOriginalFilename());
try {
InputStream inputStream = file.getInputStream();
minioClient.putObject(PutObjectArgs.builder()
.bucket(minioConfig.getBucketName())
.object(filename)
.stream(inputStream, file.getSize(), -1)
.contentType(file.getContentType())
.build());
} catch (Exception e) {
e.printStackTrace();
}
String url = minioConfig.getEndpoint() + "/" + minioConfig.getBucketName() +
"/" + filename;
return JsonData.buildSuccess(url);
}
}
// 統(tǒng)一響應(yīng)類
@Data
public class JsonData {
private int code;
private String msg;
private Object data;
public static JsonData buildSuccess(Object data) {
JsonData jsonData = new JsonData();
jsonData.setCode(0);
jsonData.setData(data);
return jsonData;
}
}六、測(cè)試與驗(yàn)證
1. 接口測(cè)試(Apifox)
- 文件上傳:
- 請(qǐng)求方式:POST
- URL:
http://localhost:8081/api/test/v1/upload - 參數(shù):form-data,key=file,value=選擇本地文件
- 響應(yīng):返回文件訪問(wèn)URL
Header需要我們選擇如下

Body需要我們選擇如下,并上傳本地文件

結(jié)果如下:

2. 控制臺(tái)驗(yàn)證
登錄MinIO控制臺(tái),進(jìn)入
ai-pan桶,查看上傳的文件是否存在。

七、注意事項(xiàng)
桶權(quán)限管理
- 若未設(shè)置桶為公開(kāi)訪問(wèn),直接訪問(wèn)URL會(huì)報(bào)403錯(cuò)誤,需使用預(yù)簽名URL(
getPresignedDownloadUrl方法) - 設(shè)置公開(kāi)訪問(wèn):在MinIO控制臺(tái)→桶設(shè)置→訪問(wèn)策略→添加規(guī)則,允許所有人訪問(wèn)
八、總結(jié)
本文詳細(xì)介紹了SpringBoot3.X整合MinIO的原生方案,從環(huán)境搭建到核心功能實(shí)現(xiàn),涵蓋了文件上傳、下載、刪除等常用操作,并補(bǔ)充了異常處理、參數(shù)校驗(yàn)、安全實(shí)踐等內(nèi)容。通過(guò)原生SDK整合,開(kāi)發(fā)者可以靈活定制存儲(chǔ)邏輯,滿足不同業(yè)務(wù)場(chǎng)景需求。
MinIO作為輕量級(jí)對(duì)象存儲(chǔ)方案,非常適合中小規(guī)模項(xiàng)目使用,結(jié)合SpringBoot的自動(dòng)化配置,能大幅提升開(kāi)發(fā)效率。后續(xù)可進(jìn)一步擴(kuò)展斷點(diǎn)續(xù)傳、文件預(yù)覽、權(quán)限控制等功能,豐富存儲(chǔ)服務(wù)的能力。
到此這篇關(guān)于SpringBoot3.X 整合 MinIO 存儲(chǔ)原生方案的文章就介紹到這了,更多相關(guān)SpringBoot3.X MinIO 存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)方式
- SpringBoot+MinIO實(shí)現(xiàn)對(duì)象存儲(chǔ)的示例詳解
- SpringBoot 對(duì)象存儲(chǔ) MinIO的詳細(xì)過(guò)程
- SpringBoot整合MinIO實(shí)現(xiàn)文件存儲(chǔ)系統(tǒng)的代碼示例
- SpringBoot使用Minio進(jìn)行文件存儲(chǔ)的實(shí)現(xiàn)
- SpringBoot中整合Minio文件存儲(chǔ)的安裝部署過(guò)程
- Springboot集成minio實(shí)現(xiàn)文件存儲(chǔ)的實(shí)現(xiàn)代碼
- 解析SpringBoot?搭建基于?MinIO?的高性能存儲(chǔ)服務(wù)的問(wèn)題
- springboot中如何使用minio存儲(chǔ)容器
相關(guān)文章
SpringBoot實(shí)現(xiàn)全局異常處理方法總結(jié)
在項(xiàng)目開(kāi)發(fā)中出現(xiàn)異常時(shí)很平常不過(guò)的事情,我們處理異常也有很多種方式。本文將詳細(xì)為大家講解SpringBoot實(shí)現(xiàn)全局異常處理幾種方法,感興趣的可以學(xué)習(xí)一下2022-03-03
如何使用Idea搭建全注解式開(kāi)發(fā)的SpringMVC項(xiàng)目
這篇文章主要介紹了如何使用Idea搭建全注解式開(kāi)發(fā)的SpringMVC項(xiàng)目,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03
使用SpringAOP實(shí)現(xiàn)公共字段填充功能
在新增員工或者新增菜品分類時(shí)需要設(shè)置創(chuàng)建時(shí)間、創(chuàng)建人、修改時(shí)間、修改人等字段,在編輯員工或者編輯菜品分類時(shí)需要設(shè)置修改時(shí)間、修改人等字段,這些字段屬于公共字段,本文將給大家介紹使用SpringAOP實(shí)現(xiàn)公共字段填充功能,需要的朋友可以參考下2024-08-08
Java Thread之Sleep()使用方法總結(jié)
這篇文章主要介紹了Java Thread之Sleep()使用方法總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
為什么在重寫(xiě) equals方法的同時(shí)必須重寫(xiě) hashcode方法
Object 類是所有類的父類,其 equals 方法比較的是兩個(gè)對(duì)象的引用指向的地址,hashcode 是一個(gè)本地方法,返回的是對(duì)象地址值。他們都是通過(guò)比較地址來(lái)比較對(duì)象是否相等的2016-07-07

