SpringBoot集成MinIO文件存储功能
文件服务器是一个应用必要的组件之一。最早我搞过FTP,然后又用过FastDFS,接私活的时候我用MongoDB也凑合凑合。现如今时代不同了,开始流行起了OSS。
协议:CC BY-SA 4.0 https://creativecommons.org/licenses/by-sa/4.0/
版权声明:本文为原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
什么是OSS
全称为Object Storage Service,也叫对象存储服务,是一种解决和处理离散单元的方法,可提供基于分布式系统之上的对象形式的数据存储服务,具有可拓展、可管理、低成本等特点,支持中心和边缘存储,能够实现存储需求的弹性伸缩,主要应用于海量数据管理的各类场景。
这概念真是够难以理解的。简单说点我知道的吧,平常我们的文件地址都是 /User/felord/video/xxx.mp4
的目录树结构,系统先要找到User
,然后一级一级往下找一直到目标为止,这是一种结构化的存储方式。对象存储就不一样了,所有的文件都放在一个特定的池子里,只不过文件的携带有它自己的元信息,通过元信息去检索文件。这里举一个形象的例子:
{
"oss":[
{
"file":"xxxxx","meta":{
"id":"1111"},"type":""},
{
"content":"xxxxx","meta":{
"id":"1211"},"type":"","created":"","name":""},
]}
上图的oss
就是一个对象存储,它里面存了携带信息不一样、甚至结构都不一样的东西,我们可以根据其元信息meta
检索它们。OSS具有以下特点:
效率更高。不受复杂目录系统对性能的影响。
可扩展性更强。分布式架构,更便于进行水平扩展,从而容纳进任意大规模的数据。
可用性更强。数据一般都会有多个位于不同机器的复制,确保数据不丢失。
平台无关,可以通过Restful接口进行操作对象。
OSS通常被用来存储图片、音视频等文件,以及对这些文件的处理。
哪些OSS可以使用
一种是Ceph,一个分布式存储系统,高可用,高扩展性
另一种是Minio,用Golang写的。我目前还没发现有什么坑,文档居然还有中文文档!
Linux 下安装MinIO
windows下安装过于简单我们来研究Linux下的安装,不过同样简单
# 下载
wget https://dl.min.io/server/minio/release/linux-amd64/minio
# 赋权
chmod +x minio
# 设置用户名
export MINIO_ACCESS_KEY=minioadmin
# 设置密码
export MINIO_SECRET_KEY=minioadmin
# 启动 /home/data是自己定义的文件目录,进入minio的下载目录
./minio server /home/data
# 静默启动
nohup ./minio server /home/data >/home/data/minio.log 2>&1 &
运行 ./minio server /home/data 看下一下画面即表示启动成功
访问 http://172.28.43.29:9000/minio/login接口看到页面
SpringBoot 集成MinIO
引入jar包
<dependency>
<groupId>io.miniogroupId>
<artifactId>minioartifactId>
<version>7.0.2version>
dependency>
配置
minio:
endpoint: http://web.codepeople.cn/
port: 9000
accessKey: minioadmin
secretKey: minioadmin
secure: false
bucketName: "hkeducation"
configDir: "/home/data"
package com.hope.minio.config;
import io.minio.MinioClient;
import io.minio.errors.InvalidEndpointException;
import io.minio.errors.InvalidPortException;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.checkerframework.checker.units.qual.A;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "minio")
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;
}
}
package com.hope.minio.utils;
import java.io.InputStream;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang3.StringUtils;
imp