手把手教你SpringBoot輕松整合Minio
前言
使用Spring Boot 可以非常方便、快速搭建項(xiàng)目,使我們不用關(guān)心框架之間的兼容性,適用版本等各種問(wèn)題,我們想使用任何東西,僅僅添加一個(gè)配置就可以。
提示:以下是本篇文章正文內(nèi)容,下面案例可供參考
一、技術(shù)介紹
1.Minio是什么?
MinIO 是一個(gè)基于Apache License v2.0開(kāi)源協(xié)議的對(duì)象存儲(chǔ)服務(wù)。它兼容亞馬遜S3云存儲(chǔ)服務(wù)接口,非常適合于存儲(chǔ)大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機(jī)鏡像等,而一個(gè)對(duì)象文件可以是任意大小,從幾kb到最大5T不等。
二、使用步驟
1.引入maven庫(kù)
代碼如下(示例):
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.4.1</version> <relativePath/> </parent> <dependencies> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.0.3</version> </dependency> </dependencies>
2.封裝Minio
IFile類:
package com.hyh.minio; /** * File接口類 * * @Author: heyuhua * @Date: 2021/1/12 10:33 */ public interface IFile { /** * 上傳 * * @param filename 文件名 */ void upload(String filename); /** * 上傳 * * @param filename 文件名 * @param object 保存對(duì)象文件名稱 */ void upload(String filename, String object); }
File接口類:
package com.hyh.minio.service; import com.hyh.minio.IFile; /** * File接口 * * @Author: heyuhua * @Date: 2021/1/12 10:53 */ public interface FileService extends IFile { /** * 上傳 * * @param filename 文件名稱 * @param object 保存對(duì)象文件名稱 * @param bucket 存儲(chǔ)桶 */ void upload(String filename, String object, String bucket); }
File接口實(shí)現(xiàn)類:
package com.hyh.minio.service.impl; import com.hyh.minio.service.FileService; import com.hyh.utils.common.StringUtils; import io.minio.BucketExistsArgs; import io.minio.MakeBucketArgs; import io.minio.MinioClient; import io.minio.UploadObjectArgs; import io.minio.errors.MinioException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; /** * 文件接口服務(wù)實(shí)現(xiàn) * * @Author: heyuhua * @Date: 2021/1/12 10:53 */ @Service public class FileServiceImpl implements FileService { /** * 日志 */ private static final Logger LOG = LoggerFactory.getLogger(FileServiceImpl.class); /** * minio 客戶端 */ @Autowired private MinioClient minioClient; /** * 默認(rèn)存儲(chǔ)桶名稱 */ @Value("${minio.bucketName:}") private String defaultBucketName; @Override public void upload(String filename) { uploadObject(filename, null, defaultBucketName); } @Override public void upload(String filename, String object) { uploadObject(filename, object, defaultBucketName); } @Override public void upload(String filename, String object, String bucket) { uploadObject(filename, object, bucket); } /** * 上傳 * * @param filename * @param object * @param bucket */ private void uploadObject(String filename, String object, String bucket) { if (StringUtils.isAnyBlank(filename, bucket)) return; try { //存儲(chǔ)桶構(gòu)建 bucketBuild(bucket); //保存的文件名稱 object = StringUtils.isBlank(object) ? filename.substring(filename.lastIndexOf("/") > 0 ? filename.lastIndexOf("/") : filename.lastIndexOf("\\")) : object; minioClient.uploadObject( UploadObjectArgs.builder() .bucket(bucket) .object(object) .filename(filename) .build()); } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException exception) { LOG.error("uploadObject error", exception); } } /** * 存儲(chǔ)桶構(gòu)建 * * @param bucketName */ private void bucketBuild(String bucketName) { try { boolean found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); if (!found) { minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build()); LOG.info("Bucket " + bucketName + " make success."); } else { LOG.info("Bucket " + bucketName + " already exists."); } } catch (MinioException | InvalidKeyException | IOException | NoSuchAlgorithmException exception) { LOG.error("bucketBuild error", exception); } } public String getDefaultBucketName() { return defaultBucketName; } public void setDefaultBucketName(String defaultBucketName) { this.defaultBucketName = defaultBucketName; } }
Minio配置類:
package com.hyh.minio.config; import io.minio.MinioClient; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @Author: heyuhua * @Date: 2021/1/12 10:42 */ @Configuration @ConfigurationProperties(prefix = "minio") public class MinioConfig { /** * endPoint是一個(gè)URL,域名,IPv4或者IPv6地址 */ private String endpoint; /** * 端口 */ private int port; /** * accessKey類似于用戶ID,用于唯一標(biāo)識(shí)你的賬戶 */ private String accessKey; /** * secretKey是你賬戶的密碼 */ private String secretKey; /** * 如果是true,則用的是https而不是http,默認(rèn)值是true */ private Boolean secure; /** * 默認(rèn)存儲(chǔ)桶 */ private String bucketName; /** * 配置目錄 */ private String configDir; @Bean public MinioClient getMinClient() { return MinioClient.builder() .endpoint(endpoint, port, secure)//http .credentials(accessKey, secretKey) .build(); } public String getEndpoint() { return endpoint; } public void setEndpoint(String endpoint) { this.endpoint = endpoint; } public String getAccessKey() { return accessKey; } public void setAccessKey(String accessKey) { this.accessKey = accessKey; } public String getSecretKey() { return secretKey; } public void setSecretKey(String secretKey) { this.secretKey = secretKey; } public Boolean getSecure() { return secure; } public void setSecure(Boolean secure) { this.secure = secure; } public String getBucketName() { return bucketName; } public void setBucketName(String bucketName) { this.bucketName = bucketName; } public String getConfigDir() { return configDir; } public void setConfigDir(String configDir) { this.configDir = configDir; } public int getPort() { return port; } public void setPort(int port) { this.port = port; } }
Minio助手類封裝:
package com.hyh.minio.helper; import com.hyh.minio.service.FileService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.util.Assert; /** * Minio助手 * * @Author: heyuhua * @Date: 2021/1/12 10:54 */ @Component public class MinioHelper { /** * 日志 */ private static final Logger LOG = LoggerFactory.getLogger(MinioHelper.class); /** * 文件接口服務(wù) */ @Autowired private FileService fileService; /** * 上傳 * * @param filename */ public void upload(String filename) { Assert.notNull(filename, "filename is null."); fileService.upload(filename); } /** * 上傳 * * @param filename * @param object */ public void upload(String filename, String object) { Assert.notNull(filename, "filename is null."); Assert.notNull(object, "object is null."); fileService.upload(filename, object); } /** * 上傳 * * @param filename * @param object * @param bucket */ public void upload(String filename, String object, String bucket) { Assert.notNull(filename, "filename is null."); Assert.notNull(object, "object is null."); Assert.notNull(bucket, "bucket is null."); fileService.upload(filename, object, bucket); } }
3.配置文件
代碼如下(示例):
server: port: 8088 #minio配置 minio: endpoint: 39.108.49.252 port: 9000 accessKey: admin secretKey: admin123 secure: false bucketName: "hyh-bucket" configDir: "/home/data/"
4.單元測(cè)試
測(cè)試代碼如下(示例):
package com.hyh.core.test; import com.hyh.core.test.base.HyhTest; import com.hyh.minio.helper.MinioHelper; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; /** * Minio Test * * @Author: heyuhua * @Date: 2021/1/12 11:54 */ public class MinioTest extends HyhTest { @Autowired private MinioHelper minioHelper; @Test public void testUpload() { //直接指向你本地的路徑測(cè)試 String filename = "E:\\home\\static\\img\\fsPic\\0c34de99ac6b4c56812e83c4eab13a6f.jpg"; String object = "hyh-test-name.jpg"; String bucket = "hyh-test-bucket"; minioHelper.upload(filename); minioHelper.upload(filename, object); minioHelper.upload(filename, object, bucket); //上傳完后打開(kāi)瀏覽器訪問(wèn) http://ip:9000 登錄控制臺(tái)可查看上傳的文件 } @Test @Override public void test() { System.out.println("---minio 測(cè)試---"); } }
總結(jié)
是不是感覺(jué)很簡(jiǎn)單?關(guān)注我?guī)憬颐馗郙inio高級(jí)用法 源碼地址:點(diǎn)此查看源碼.
以上就是手把手教你SpringBoot輕松整合Minio的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot整合Minio的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- SpringBoot整合MinIO實(shí)現(xiàn)文件上傳的方法詳解
- springboot整合minio實(shí)現(xiàn)文件上傳與下載且支持鏈接永久訪問(wèn)
- 可能是全網(wǎng)最詳細(xì)的springboot整合minio教程
- SpringBoot整合Minio實(shí)現(xiàn)文件上傳和讀取功能
- springboot整合minio的超詳細(xì)教程
- SpringBoot整合Minio實(shí)現(xiàn)圖片上傳功能
- SpringBoot使用minio及配置代碼
- SpringBoot項(xiàng)目集成MinIO全過(guò)程
- SpringBoot封裝MinIO工具的實(shí)現(xiàn)步驟
相關(guān)文章
鄰接表無(wú)向圖的Java語(yǔ)言實(shí)現(xiàn)完整源碼
這篇文章主要介紹了鄰接表無(wú)向圖的Java語(yǔ)言實(shí)現(xiàn)完整源碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。2017-12-12SpringBoot整合Mybatis-plus案例及用法實(shí)例
mybatis-plus是一個(gè) Mybatis 的增強(qiáng)工具,在 Mybatis 的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下2022-11-11解決Spring在Thread中注入Bean無(wú)效的問(wèn)題
這篇文章主要介紹了解決Spring在Thread中注入Bean無(wú)效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02Java簡(jiǎn)單計(jì)算器的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了Java簡(jiǎn)單計(jì)算器的實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12Java使用CompletableFuture實(shí)現(xiàn)異步編程
在現(xiàn)代 Java 開(kāi)發(fā)中,異步編程是一項(xiàng)重要技能,而 CompletableFuture 是從 Java 8 開(kāi)始提供的一個(gè)功能強(qiáng)大的工具,用于簡(jiǎn)化異步任務(wù)的編寫(xiě)和組合,本文將詳細(xì)介紹 CompletableFuture 的基本使用和一些常見(jiàn)的應(yīng)用場(chǎng)景,需要的朋友可以參考下2025-01-01通過(guò)Session案例分析一次性驗(yàn)證碼登錄
這篇文章主要介紹了通過(guò)Session案例分析一次性驗(yàn)證碼登錄,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-03-03MyBatis如何調(diào)用存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)
這篇文章主要介紹了MyBatis如何調(diào)用存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11