SpringBoot整合minio服務(wù)的示例代碼
一、使用docker部署minio
1、拉取鏡像
docker pull minio/minio
2、創(chuàng)建目錄
mkdir -p /home/minio/config mkdir -p /home/minio/data
3、創(chuàng)建Minio容器并運(yùn)行
docker run -p 9000:9000 -p 9090:9090 \
--net=host \
--name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=minioadmin" \
-e "MINIO_SECRET_KEY=minioadmin" \
-v /home/minio/data:/data \
-v /home/minio/config:/root/.minio \
minio/minio server \
/data --console-address ":9090" -address ":9000"
4、登錄minio控制臺(tái)

5、創(chuàng)建buckets存儲(chǔ)桶測試

創(chuàng)建一個(gè)名為public的存儲(chǔ)桶(名字可自定義),上傳文件。

通過http://ip:9000/存儲(chǔ)桶名/文件名訪問文件

若出現(xiàn):

可以將存儲(chǔ)桶的訪問權(quán)限設(shè)置為public.

二、SpringBoot整合minio
1、創(chuàng)建minio-demo項(xiàng)目

2、引入pom依賴
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>3、編寫配置文件
在application.yml文件中編寫相關(guān)配置。
server:
port: 8081
spring:
# 配置文件上傳大小限制
servlet:
multipart:
max-file-size: 200MB
max-request-size: 200MB
minio:
host: http://127.0.0.1:9000
url: ${minio.host}/${minio.bucket}/
access-key: minioadmin
secret-key: minioadmin
bucket: public
4、編寫MinioConfig配置類
import io.minio.MinioClient;
import io.minio.PutObjectOptions;
import io.minio.Result;
import io.minio.messages.Bucket;
import io.minio.messages.Item;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.Assert;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.util.UriUtils;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
@Component
public class MinioConfig implements InitializingBean {
@Value(value = "${minio.bucket}")
private String bucket;
@Value(value = "${minio.host}")
private String host;
@Value(value = "${minio.url}")
private String url;
@Value(value = "${minio.access-key}")
private String accessKey;
@Value(value = "${minio.secret-key}")
private String secretKey;
private MinioClient minioClient;
@Override
public void afterPropertiesSet()
throws Exception {
Assert.hasText(url, "Minio url 為空");
Assert.hasText(accessKey, "Minio accessKey為空");
Assert.hasText(secretKey, "Minio secretKey為空");
this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);
}
/**
* 上傳
*
* @param multipartFile
* @return
* @throws Exception
*/
public String putObject(MultipartFile multipartFile) throws Exception {
// bucket 不存在,創(chuàng)建
if (!minioClient.bucketExists(this.bucket)) {
minioClient.makeBucket(this.bucket);
}
try (InputStream inputStream = multipartFile.getInputStream()) {
// 上傳文件的名稱
String fileName = multipartFile.getOriginalFilename();
// PutObjectOptions,上傳配置(文件大小,內(nèi)存中文件分片大小)
PutObjectOptions putObjectOptions =
new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
// 文件的ContentType
putObjectOptions.setContentType(multipartFile.getContentType());
minioClient.putObject(this.bucket, fileName, inputStream, putObjectOptions);
// 返回訪問路徑
return this.url + UriUtils.encode(fileName, StandardCharsets.UTF_8);
}
}
/**
* 列出所有存儲(chǔ)桶名稱
*
* @return
* @throws Exception
*/
public List<String> listBucketNames()
throws Exception {
List<Bucket> bucketList = listBuckets();
List<String> bucketListName = new ArrayList<>();
for (Bucket bucket : bucketList) {
bucketListName.add(bucket.name());
}
return bucketListName;
}
/**
* 查看所有桶
*
* @return
* @throws Exception
*/
public List<Bucket> listBuckets()
throws Exception {
return minioClient.listBuckets();
}
/**
* 檢查存儲(chǔ)桶是否存在
*
* @param bucketName
* @return
* @throws Exception
*/
public boolean bucketExists(String bucketName) throws Exception {
boolean flag = minioClient.bucketExists(bucketName);
if (flag) {
return true;
}
return false;
}
/**
* 創(chuàng)建存儲(chǔ)桶
*
* @param bucketName
* @return
* @throws Exception
*/
public boolean makeBucket(String bucketName)
throws Exception {
boolean flag = bucketExists(bucketName);
if (!flag) {
minioClient.makeBucket(bucketName);
return true;
} else {
return false;
}
}
/**
* 刪除桶
*
* @param bucketName
* @return
* @throws Exception
*/
public boolean removeBucket(String bucketName)
throws Exception {
boolean flag = bucketExists(bucketName);
if (flag) {
Iterable<Result<Item>> myObjects = listObjects(bucketName);
for (Result<Item> result : myObjects) {
Item item = result.get();
// 有對象文件,則刪除失敗
if (item.size() > 0) {
return false;
}
}
// 刪除存儲(chǔ)桶,注意,只有存儲(chǔ)桶為空時(shí)才能刪除成功。
minioClient.removeBucket(bucketName);
flag = bucketExists(bucketName);
if (!flag) {
return true;
}
}
return false;
}
/**
* 列出存儲(chǔ)桶中的所有對象
*
* @param bucketName 存儲(chǔ)桶名稱
* @return
* @throws Exception
*/
public Iterable<Result<Item>> listObjects(String bucketName) throws Exception {
boolean flag = bucketExists(bucketName);
if (flag) {
return minioClient.listObjects(bucketName);
}
return null;
}
/**
* 列出存儲(chǔ)桶中的所有對象名稱
*
* @param bucketName 存儲(chǔ)桶名稱
* @return
* @throws Exception
*/
public List<String> listObjectNames(String bucketName) throws Exception {
List<String> listObjectNames = new ArrayList<>();
boolean flag = bucketExists(bucketName);
if (flag) {
Iterable<Result<Item>> myObjects = listObjects(bucketName);
for (Result<Item> result : myObjects) {
Item item = result.get();
listObjectNames.add(item.objectName());
}
}
return listObjectNames;
}
/**
* 刪除一個(gè)對象
*
* @param bucketName 存儲(chǔ)桶名稱
* @param objectName 存儲(chǔ)桶里的對象名稱
* @throws Exception
*/
public boolean removeObject(String bucketName, String objectName) throws Exception {
boolean flag = bucketExists(bucketName);
if (flag) {
List<String> objectList = listObjectNames(bucketName);
for (String s : objectList) {
if(s.equals(objectName)){
minioClient.removeObject(bucketName, objectName);
return true;
}
}
}
return false;
}
/**
* 文件訪問路徑
*
* @param bucketName 存儲(chǔ)桶名稱
* @param objectName 存儲(chǔ)桶里的對象名稱
* @return
* @throws Exception
*/
public String getObjectUrl(String bucketName, String objectName) throws Exception {
boolean flag = bucketExists(bucketName);
String url = "";
if (flag) {
url = minioClient.getObjectUrl(bucketName, objectName);
}
return url;
}
}

開發(fā)中上傳接口用得較多,其他接口可自行測試。
三、Vue+Element-ui前端交互

# npm下載element-ui npm install element-ui -S
// 引入ElementUI import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' Vue.use(ElementUI)
到此這篇關(guān)于SpringBoot整合minio服務(wù)的示例代碼的文章就介紹到這了,更多相關(guān)SpringBoot整合minio服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java避免死鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在有些情況下死鎖是可以避免的。本文將展示三種用于避免死鎖的技術(shù)。對java避免死鎖的相關(guān)知識(shí)感興趣的朋友一起通過本文學(xué)習(xí)吧2017-06-06
java并發(fā)編程專題(九)----(JUC)淺析CyclicBarrier
這篇文章主要介紹了java CyclicBarrier的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
SpringBoot優(yōu)雅地實(shí)現(xiàn)全局異常處理的方法詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何優(yōu)雅地實(shí)現(xiàn)全局異常處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08
Java的LinkedHashMap的實(shí)現(xiàn)原理詳解
這篇文章主要介紹了Java的LinkedHashMap的實(shí)現(xiàn)原理詳解,???LinkedHashMap是Map接口的哈希表和鏈接列表實(shí)現(xiàn),具有可預(yù)知的迭代順序,此實(shí)現(xiàn)提供所有可選的映射操作,并允許使用null值和null鍵,此類不保證映射的順序,特別是它不保證該順序恒久不變,需要的朋友可以參考下2023-09-09
解讀Spring定義Bean的兩種方式:<bean>和@Bean
這篇文章主要介紹了Spring定義Bean的兩種方式:<bean>和@Bean,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04

