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ǔ)桶測(cè)試
創(chuàng)建一個(gè)名為public的存儲(chǔ)桶(名字可自定義),上傳文件。
通過(guò)http://ip:9000/存儲(chǔ)桶名/文件名訪問(wèn)文件
若出現(xiàn):
可以將存儲(chǔ)桶的訪問(wèn)權(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); // 返回訪問(wèn)路徑 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(); // 有對(duì)象文件,則刪除失敗 if (item.size() > 0) { return false; } } // 刪除存儲(chǔ)桶,注意,只有存儲(chǔ)桶為空時(shí)才能刪除成功。 minioClient.removeBucket(bucketName); flag = bucketExists(bucketName); if (!flag) { return true; } } return false; } /** * 列出存儲(chǔ)桶中的所有對(duì)象 * * @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ǔ)桶中的所有對(duì)象名稱 * * @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è)對(duì)象 * * @param bucketName 存儲(chǔ)桶名稱 * @param objectName 存儲(chǔ)桶里的對(duì)象名稱 * @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; } /** * 文件訪問(wèn)路徑 * * @param bucketName 存儲(chǔ)桶名稱 * @param objectName 存儲(chǔ)桶里的對(duì)象名稱 * @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; } }
開(kāi)發(fā)中上傳接口用得較多,其他接口可自行測(cè)試。
三、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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java避免死鎖_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
在有些情況下死鎖是可以避免的。本文將展示三種用于避免死鎖的技術(shù)。對(duì)java避免死鎖的相關(guān)知識(shí)感興趣的朋友一起通過(guò)本文學(xué)習(xí)吧2017-06-06java并發(fā)編程專題(九)----(JUC)淺析CyclicBarrier
這篇文章主要介紹了java CyclicBarrier的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07SpringBoot優(yōu)雅地實(shí)現(xiàn)全局異常處理的方法詳解
這篇文章主要為大家詳細(xì)介紹了SpringBoot如何優(yōu)雅地實(shí)現(xiàn)全局異常處理,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08Java的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à)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04