springboot?使用?minio的示例代碼
什么是MinIo
MinIO 是一個基于Apache License v2.0開源協(xié)議的對象存儲服務(wù)。它兼容亞馬遜S3云存儲服務(wù)接口,非常適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),例如圖片、視頻、日志文件、備份數(shù)據(jù)和容器/虛擬機鏡像等,而一個對象文件可以是任意大小,從幾kb到最大5T不等。MinIO是一個非常輕量的服務(wù),可以很簡單的和其他應(yīng)用的結(jié)合,類似 NodeJS, Redis 或者 MySQL。
Minio主要用來存儲非結(jié)構(gòu)化的數(shù)據(jù),類似文件,圖片,照片,日志文件,各類備份文件等,按照官網(wǎng)描述,文件的大小從幾KB到5TB。
Minio提供了非常方便,友好的界面,并且文檔也是非常豐富,具體可以參考它的文檔:https://docs.min.io/cn/
為什么選擇MinIo
在之前開發(fā)中曾使用了分布式文件服務(wù)FASTDFS和阿里云的OSS對象存儲來存儲。奈何OSS太貴,F(xiàn)ASTDFS搭建配置又太繁瑣,今天給大家推薦一款極易上手的高性能對象存儲服務(wù)MinIo。
MinIO 是高性能的對象存儲,兼容 Amazon S3接口,充分考慮開發(fā)人員的需求和體驗;支持分布式存儲,具備高擴展性、高可用性;部署簡單但功能豐富。官方的文檔也很詳細。它有多種不同的部署模式(單機部署,分布式部署)。
為什么說 MinIO 簡單易用,原因就在于它的啟動、運行和配置都很簡單??梢酝ㄟ^ docker 方式進行安裝運行,也可以下載二進制文件,然后使用腳本運行。
下面介紹下springboot 使用 minio的詳細方法,代碼如下所示:
yml 配置 # ====================== ↓↓↓↓↓↓ MinIO文件服務(wù)器 ↓↓↓↓↓↓ ====================== minio: url: http://114.67.110.190:9001 accessKey: minioadmin secretKey: minioadmin bucketName: zpf
maven:
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.0</version> </dependency>
屬性文件:
package com.example.minio; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Data @Configuration @ConfigurationProperties(prefix = "minio") public class MinIoProperties { /** * minio地址+端口號 */ private String url; * minio用戶名 private String accessKey; * minio密碼 private String secretKey; * 文件桶的名稱 private String bucketName; }
工具類:
package com.example.minio; import io.minio.MinioClient; import io.minio.ObjectStat; import io.minio.PutObjectOptions; import io.minio.messages.Bucket; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.net.URLEncoder; import java.util.List; @Slf4j @Component public class MinIoUtil { @Autowired MinIoProperties minIoProperties; private static MinioClient minioClient; /** * 初始化minio配置 * * @param : * @return: void * @date : 2020/8/16 20:56 */ @PostConstruct public void init() { try { minioClient = new MinioClient(minIoProperties.getUrl(), minIoProperties.getAccessKey(), minIoProperties.getSecretKey()); createBucket(minIoProperties.getBucketName()); } catch (Exception e) { e.printStackTrace(); log.error("初始化minio配置異常: 【{}】", e.fillInStackTrace()); } } * 判斷 bucket是否存在 * @param bucketName: * 桶名 * @return: boolean * @date : 2020/8/16 20:53 @SneakyThrows(Exception.class) public static boolean bucketExists(String bucketName) { return minioClient.bucketExists(bucketName); * 創(chuàng)建 bucket public static void createBucket(String bucketName) { boolean isExist = minioClient.bucketExists(bucketName); if (!isExist) { minioClient.makeBucket(bucketName); * 獲取全部bucket * @return: java.util.List<io.minio.messages.Bucket> * @date : 2020/8/16 23:28 public static List<Bucket> getAllBuckets() { return minioClient.listBuckets(); * 文件上傳 * @param fileName: * 文件名 * @param filePath: * 文件路徑 public static void upload(String bucketName, String fileName, String filePath) { minioClient.putObject(bucketName, fileName, filePath, null); * @param stream: * 文件流 * @return: java.lang.String : 文件url地址 * @date : 2020/8/16 23:40 public static String upload(String bucketName, String fileName, InputStream stream) { minioClient.putObject(bucketName, fileName, stream, new PutObjectOptions(stream.available(), -1)); return getFileUrl(bucketName, fileName); * @param file: * 文件 public static String upload(String bucketName, MultipartFile file) { final InputStream is = file.getInputStream(); final String fileName = file.getOriginalFilename(); minioClient.putObject(bucketName, fileName, is, new PutObjectOptions(is.available(), -1)); is.close(); * 刪除文件 public static void deleteFile(String bucketName, String fileName) { minioClient.removeObject(bucketName, fileName); * 下載文件 * @param response: * @date : 2020/8/17 0:34 public static void download(String bucketName, String fileName, HttpServletResponse response) { // 獲取對象的元數(shù)據(jù) final ObjectStat stat = minioClient.statObject(bucketName, fileName); response.setContentType(stat.contentType()); response.setCharacterEncoding("UTF-8"); response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8")); InputStream is = minioClient.getObject(bucketName, fileName); IOUtils.copy(is, response.getOutputStream()); * 獲取minio文件的下載地址 * @return: java.lang.String * @date : 2020/8/16 22:07 public static String getFileUrl(String bucketName, String fileName) { return minioClient.presignedGetObject(bucketName, fileName); }
到此這篇關(guān)于springboot 使用 minio的文章就介紹到這了,更多相關(guān)springboot 使用 minio內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java實現(xiàn)百萬Excel數(shù)據(jù)導(dǎo)出
這篇文章主要為大家詳細介紹了如何使用Java實現(xiàn)百萬Excel數(shù)據(jù)導(dǎo)出,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以參考一下2024-03-03淺談java調(diào)用Restful API接口的方式
這篇文章主要介紹了淺談java調(diào)用Restful API接口的方式,具有一定借鑒價值,需要的朋友可以參考下。2017-12-12詳解Springboot整合Dubbo之代碼集成和發(fā)布
本篇文章主要介紹了Springboot整合Dubbo之代碼集成和發(fā)布,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時的兩種操作方式
這篇文章主要介紹了java前后端傳值,參數(shù)有集合類型的數(shù)據(jù)時的兩種操作方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-11-11springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建)
這篇文章主要介紹了springboot-2.3.x最新版源碼閱讀環(huán)境搭建(基于gradle構(gòu)建),需要的朋友可以參考下2020-08-08