Minio的安装与使用一、Minio介绍 MinIO 是在 Apache License v2.0 下发布的高性能对象存储. 就是说是个存东西的玩意,比较方便配好启动就能访问,也不用什么nginx转发啊什么东西的,简单方便
二、服务端部署MinioMinIO 是在 Apache License v2.0 下发布的高性能对象存储.
就是说是个存东西的玩意,比较方便配好启动就能访问,也不用什么nginx转发啊什么东西的,简单方便。 就是上传文件下载文件的一个 嗯。。东西
下载地址
看的出来,用起来很简单,下面就三行命令。从下载到启动
//下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio
//放到工作目录下执行,放权
chmod +x minio
//启动 可以在 服务器的 9001 端口进入 账号密码如下
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
//配置启动
./minio server /自定义Minio的配置目录
//启动后会生成一个文件夹,修改config/config.json
access_key = 账号
secret_key = 密码
//后台挂起
nohup 二进制文件所在目录 server 自定义配置目录 > 自定义启动日志.log 2>&1 &
//例如
nohup /usr/minio server /usr/con > /usr/minio.log 2>&1 &
//创建的所有桶都在 自定义配置目录下
三、java使用Minio (1)、先导入依赖桶的概念,我的理解是一个父级目录,比如说创建桶1放视频,桶2放图片啊之类的
//maven
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
//Gradle
implementation 'io.minio:minio:7.0.2'
(2)、编写工具类另外本人建议不要用最新版的,貌似每个版本更新的都挺大,会导致很多api不能用,代码改动之大跟重构了一样
@Component
public class MinioHelper {
//桶名称
private String bucket;
//远程主机地址
private String host;
//主机/桶名称/
private String url;
//账号
private String accessKey;
//密码
private String secretKey;
private MinioClient minioClient;
@PostConstruct
public void init() throws Exception {
this.minioClient = new MinioClient(this.host, this.accessKey, this.secretKey);
}
/**
* 上传
*
* @param request
* @param num
*/
public List<String> putObject(MultipartFile multipartFile) throws Exception {
// bucket 不存在,创建
if (!minioClient.bucketExists(this.bucket)) {
minioClient.makeBucket(this.bucket);
}
InputStream inputStream;
try {
inputStream = Objects.requireNonNull(multipartFile).getInputStream();
// PutObjectOptions,上传配置(文件大小,内存中文件分片大小)
PutObjectOptions putObjectOptions = new PutObjectOptions(multipartFile.getSize(), PutObjectOptions.MIN_MULTIPART_SIZE);
// 文件的ContentType
putObjectOptions.setContentType(multipartFile.getContentType());
//UUID生成唯一文件名 加 文件后缀名
String imgName = UUID.randomUUID().toString().replace("-", "") + Objects.requireNonNull(multipartFile.getOriginalFilename()).substring(multipartFile.getOriginalFilename().lastIndexOf("."));
//上传
minioClient.putObject(this.bucket, imgName, inputStream, putObjectOptions);
//返回可访问路径
this.url + UriUtils.encode(imgName, StandardCharsets.UTF_8)
} catch (Exception ex) {
throw new CustomizeException(ErrorCode.UP_IMAGE_ERROR);
}
return 上边那个可访问路径;
}
/**
* 列出所有存储桶名称
*/
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;
}
/**
* 查看所有桶
*/
public List<Bucket> listBuckets()
throws Exception {
return minioClient.listBuckets();
}
/**
* 检查存储桶是否存在
*/
public boolean bucketExists(String bucketName)
throws Exception {
return minioClient.bucketExists(bucketName);
}
/**
* 创建存储桶
*/
public boolean makeBucket(String bucketName)
throws Exception {
boolean flag = bucketExists(bucketName);
if (!flag) {
minioClient.makeBucket(bucketName);
return true;
} else {
return false;
}
}
/**
* 删除桶
*/
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();
// 有对象文件,则删除失败
if (item.size() > 0) {
return false;
}
}
// 删除存储桶,注意,只有存储桶为空时才能删除成功。
minioClient.removeBucket(bucketName);
flag = bucketExists(bucketName);
return !flag;
}
return false;
}
/**
* 列出存储桶中的所有对象
*/
public Iterable<Result<Item>> listObjects(String bucketName)
throws Exception {
boolean flag = bucketExists(bucketName);
if (flag) {
return minioClient.listObjects(bucketName);
}
return null;
}
/**
* 列出存储桶中的所有对象名称
*
* @param bucketName 存储桶名称
*/
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;
}
/**
* 删除一个对象
*
* @param bucketName 存储桶名称
* @param objectName 存储桶里的对象名称
*/
public boolean removeObject(String bucketName, String objectName)
throws Exception {
boolean flag = bucketExists(bucketName);
if (flag) {
minioClient.removeObject(bucketName, objectName);
return true;
}
return false;
}
/**
* 文件访问路径
*
* @param bucketName 存储桶名称
* @param objectName 存储桶里的对象名称
*/
public String getObjectUrl(String bucketName, String objectName) throws Exception {
boolean flag = bucketExists(bucketName);
String url = "";
if (flag) {
url = minioClient.getObjectUrl(bucketName, objectName);
}
return url;
}
}
这样就可以上传文件了,至于说上传多文件,也是用循环去上传。
值得注意的是,SpringBoot默认上传文件大小为 1MB,所以需要配置一下
#解决过滤器导致文件传不过来
servlet:
multipart:
max-file-size: 单文件最大 大小
max-request-size: 一次请求发送的文件最大 大小
如果你配置了过滤器则需要
mvc:
hiddenmethod:
filter:
enabled: true
(3)、访问图片这连个都是Spring下的配置
如果你惊奇的发现图片无法访问,那么进去管理后台找到你的那个桶,然后
设置访问权限为Public
迷途者寻影而行剩下的可以慢慢玩~