一、MinIO简介及Linux安装运行
1、简介
MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。
这里仅描述API的简单应用。
2、在Linux安装运行
官方中文文档:https://docs.min.io/cn/minio-quickstart-guide.html
按照地址下载执行文件,放在指定目录下,
(1)、执行截图中的命令可快速把服务运行起来。
(2)、上面(1)是快速启动,一旦关闭命令窗口服务就挂了。下面命令可实现关闭命令窗口仍可运行并且能够设置账号密码、生成日志。
cd /root
# 设置账号
export MINIO_ACCESS_KEY=XXXXXX
# 设置密码
export MINIO_SECRET_KEY=XXXXXX
# nohup启动服务 指定文件存放路径 /root/data 还有设置日志文件路径 /root/minio/log
nohup /root/minio server /root/data > /root/log/minio.log 2>&1 &
用http://IP:端口/minio/login(端口默认是9000,我这里是9001)运行之后输入账号密码登录。
二、Spring Boot 配置MinIO
1、application.yml配置
# 图片服务器 minio配置
minio:
ip: xxxxxxx:9001
# minio登录账号密码
accessKey: xxxxxxx
secretKey: xxxxxxxx
## 桶名(文件夹)命名规则要符合 亚马逊S3标准 详情可看http://docs.aws.amazon.com/AmazonS3/latest/dev/BucketRestrictions.html
bucketName:
## 照片文件夹
facility: facility-photos
2、MinIO API依赖
<!-- minio api-->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>5.0.2</version>
</dependency>
3、操作API 类
更多Java Client API 请参考https://docs.min.io/cn/java-client-api-reference.html
package zondy.config;
import io.minio.MinioClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import zondy.entity.enums.ResultEnum;
import zondy.utils.R;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @ClassName Minio
* @Description Minio文件存储云服务相关工具类 api文档:https://docs.min.io/cn/java-client-api-reference.html
* @Author sya
* @Date 2019/8/1 20:05
**/
@Component
@Slf4j
public class Minio {
/**
* 服务器地址
*/
@Value("${minio.ip}")
private String ip;
/**
* 登录账号
*/
@Value("${minio.accessKey}")
private String accessKey;
/**
* 登录密码
*/
@Value("${minio.secretKey}")
private String secretKey;
/**
* 缩略图大小
*/
@Value("${minio.thumbor.width}")
private String thumborWidth;
/**
* Minio文件上传
* @param file 文件实体
* @param fileName 修饰过的文件名 非源文件名
* @param bucketName 所存文件夹(桶名)
* @return
*/
public R minioUpload(MultipartFile file, String fileName, String bucketName) {
try {
MinioClient minioClient = new MinioClient("https://" + ip, accessKey, secretKey);
boolean bucketExists = minioClient.bucketExists(bucketName);
if (bucketExists) {
log.info("仓库" + bucketName + "已经存在,可直接上传文件。");
} else {
minioClient.makeBucket(bucketName);
}
if (file.getSize() <= 20971520) {
// fileName为空,说明要使用源文件名上传
if (fileName == null) {
fileName = file.getOriginalFilename();
fileName = fileName.replaceAll(" ", "_");
}