1.Minio服务器简介
MinIO 非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。
MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。而且它有可视化的界面,很容易上手操作。详细的自行查阅。
2.特点
Minio 有良好的存储机制;
Minio 有很好纠删码的算法与擦除编码算法;
拥有RS code 编码数据恢复原理;
搭建自己的一套文件系统服务,对文件数据进行安全保护;
拥有自己的平台,不限于其他方限制。
3.搭建(在Docker中搭建MinIO单点模式,这里我只是普通的单机模式,没有建集群,平时使用的话已经可以了)
#镜像拉取
Docker pull minio/minio
MinIO 需要一个持久卷来存储配置和应用数据。不过, 如果只是为了测试一下, 您可以通过简单地传递一个目录(在下面的示例中为/ data)启动MinIO。这个目录会在容器启动时在容器的文件系统中创建,不过所有的数据都会在容器退出时丢失。
docker run -p 9000:9000 minio/minio server /data
要创建具有永久存储的MinIO容器,您需要将本地持久目录从主机操作系统映射到虚拟配置~/.minio 并导出/data目录。 为此,请运行以下命令:
docker run -p 9000:9000 --name minio1
-v /mnt/data:/data
-v /mnt/config:/root/.minio
minio/minio server /data
这样就启动了,直接访问就可以了,默认端口是9000,账户密码默认都是minioadmin,也可以自己设置:
docker run -p 9000:9000
-e MINIO_ACCESS_KEY=admin
-e MINIO_SECRET_KEY=123456
-v /data:/data minio/minio server /data
4.项目应用
添加项目所需要的依赖:
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>7.0.2</version>
</dependency>
配置文件进行项目的配置:
##minio配置
minio:
##主机ip
endpoint: ip地址
##端口
port: 9000
##账号密码
accessKey: minioadmin
secretKey: minioadmin
secure: false
##默认的bucket,存储文件的位置
bucketName: “video”
项目中新建一个配置类MinioConfig进行配置:
public class MinioConfig {
@ApiModelProperty("endPoint是一个URL,域名,IPv4或者IPv6地址")
private String endpoint;
@ApiModelProperty("TCP/IP端口号")
private int port;
@ApiModelProperty("accessKey类似于用户ID,用于唯一标识你的账户")
private String accessKey;
@ApiModelProperty("secretKey是你账户的密码")
private String secretKey;
@ApiModelProperty("如果是true,则用的是https而不是http,默认值是true")
private Boolean secure;
@ApiModelProperty("默认存储桶")
private String bucketName;
@ApiModelProperty("配置目录")
private String configDir;
@Bean
public MinioClient getMinioClient() throws InvalidEndpointException, InvalidPortException {
MinioClient minioClient = new MinioClient(endpoint, port, accessKey, secretKey, secure);
return minioClient;
}
}
这样我们就可以将MinioClient进行注入。
通过MinioClient调用官方的api进行文件的上传、下载等操作。
比如上传的方法:
minioClient.putObject(String bucketName, String objectName, InputStream stream, PutObjectOptions options)
5.需要特别注意的坑
在开发过程当中,文件上传成功之后进行访问文件的时候,比如说图片、视频文件等,直接访问路径的时候不能直接看到效果,而是直接弹出下载框进行下载。导致出现这个问题的原因可能有两个:
(1)原因是因为minIO没有配置bucket策略,默认情况下,minIO没有配置匿名读写的权限;
在bucket菜单栏中点击Edit policy,新增Read权限,(Read Only 或 Read and Write均可),即可通过链接的方式直接访问该文件。
(2)由于浏览器的限制,当上传文件时,设置header为application/octet-stream时,浏览器打开链接会默认进行下载而不是在浏览器中加载文件,所以如果想要文件时直接打开,上传时则不要设置application/octet-stream。
上传文件的时候如果使用默认的文件头时,调用的方法是:
minioClient.putObject(bucketName,fileName,inputStream)
通过查看源码可以看到这个方法默认的文件头格式就是二进制流格式;
minioClient.putObject(String bucketName, String objectName, InputStream stream, PutObjectOptions options)
源码中这个方法就是可以进行文件头的设置,创建一个PutObjectOptions实例进行设置:
PutObjectOptions putObjectOptions = new PutObjectOptions(photoInputStream.available(), 5242881L);
putObjectOptions.setContentType("image/jpeg");
关于PutObjectOptions对象更多的信息可以在官方文档中进行查看。
写的不是很全面,不喜勿喷,有问题欢迎留言区交流,感谢大佬们!