springboot 使用 minio
安和桥@write_boy 人气:4什么是MinIo
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
Minio主要用来存储非结构化的数据,类似文件,图片,照片,日志文件,各类备份文件等,按照官网描述,文件的大小从几KB到5TB。
Minio提供了非常方便,友好的界面,并且文档也是非常丰富,具体可以参考它的文档:https://docs.min.io/cn/
为什么选择MinIo
在之前开发中曾使用了分布式文件服务FASTDFS和阿里云的OSS对象存储来存储。奈何OSS太贵,FASTDFS搭建配置又太繁琐,今天给大家推荐一款极易上手的高性能对象存储服务MinIo。
MinIO 是高性能的对象存储,兼容 Amazon S3接口,充分考虑开发人员的需求和体验;支持分布式存储,具备高扩展性、高可用性;部署简单但功能丰富。官方的文档也很详细。它有多种不同的部署模式(单机部署,分布式部署)。
为什么说 MinIO 简单易用,原因就在于它的启动、运行和配置都很简单。可以通过 docker 方式进行安装运行,也可以下载二进制文件,然后使用脚本运行。
下面介绍下springboot 使用 minio的详细方法,代码如下所示:
yml 配置 # ====================== ↓↓↓↓↓↓ MinIO文件服务器 ↓↓↓↓↓↓ ====================== 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); * 创建 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) { // 获取对象的元数据 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); }
加载全部内容