文章目录:
Minio
1、 简介
MinIO 是一个用 Golang 开发的基于 Apache License v2.0 源协议的对象存储服务。
它兼容亚马逊 S3 云存储服务接口,适合存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,单个文件可以是任意大小,从几kb到最大5T不等。
2、 安装
使用 docker 安装
docker pull minio/minio
3、 启动
docker run -d -p 9010:9000 -p 9020:9020 --name minio -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123456" -v E:\minio\data:/data -v E:\minio\config:/root/.minio minio/minio server /data --console-address ":9020"
说明:
-
-d
:后台启动 -
-p
:端口映射 -
--name
:容器名称 -
-e
:设置环境变量
--v
:文件挂载 -
minio/minio server /data
:启动命令 -
--console-address ":9020"
:静态端口
9020 为控制台访问端口。
4、 创建存储桶 & 设置权限
创建存储桶:
设置存储桶权限:
Spring Boot 整合 Minio
1、添加 Maven 依赖
<!-- Minio 依赖 -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.2</version>
</dependency>
<!-- 工具类库 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
2、 配置 Minio 属性
# minio配置信息
# 连接地址
minio.endpoint=http://127.0.0.1:9010
# 用户名
minio.accessKey=admin
# 密码
minio.secretKey=admin123456
3、Spring Boot 中配置 Minio
MinioProperties.java
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
/**
* 连接地址
*/
private String endpoint;
/**
* 用户名
*/
private String accessKey;
/**
* 密码
*/
private String secretKey;
}
MinioConfig.java
@Configuration
@EnableConfigurationProperties(MinioProperties.class)
public class MinioConfig {
@Resource
private MinioProperties minioProperties;
@Bean
public MinioClient minioClient() {
return MinioClient.builder()
.endpoint(minioProperties.getEndpoint())
.credentials(minioProperties.getAccessKey(), minioProperties.getSecretKey())
.build();
}
}
4、处理上传文件的控制器类
private static final String FILE_NAME_PATTERN = "{}_{}";
// ...
@RequestMapping("/upload")
public Object upload(MultipartFile file) {
// 上传文件的原始文件名
String originalFilename = file.getOriginalFilename();
// 文件大小
long fileSize = file.getSize();
log.info("上传文件的原始文件名:{},文件大小:{}", originalFilename, fileSize);
// 文件名:日期_原始文件名
String fileName = StrUtil.format(FILE_NAME_PATTERN, DateUtil.format(new Date(), "yyyyMMddHHmmss"), originalFilename);
log.info("格式化后的文件名:{}", fileName);
try {
minioClient.putObject(PutObjectArgs.builder().bucket("my-bucket")
.object(fileName).stream(file.getInputStream(), fileSize, -1).contentType(file.getContentType()).build());
} catch (Exception e) {
log.info("上传文件失败!", e);
return result(500, "上传失败!");
}
return result(200, "上传成功!");
}
FILE_NAME_PATTERN
是上传文件的命名格式。第一个{}
放的是上传时间,格式是yyyyMMddHHmmss
,精确到秒。第二个{}
放的是上传文件的原始文件名。