携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第10天,点击查看活动详情
文章目录:
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 为控制台访问端口。
Minio后台访问地址:http://localhost:9020/
,用户名:admin
,密码:admin123456
。
4、 创建存储桶 & 设置权限
登录成功后,系统默认展示的页面为存储桶页面(URL:http://localhost:9020/buckets
)。在存储桶页面点击Create Bucket
按钮创建存储桶:
输入存储桶名称创建存储桶,创建成功后点击Manage
按钮设置存储桶权限:
Access Rules
--> Add Access Rule
,要弹出的对话框中输入如下信息:
- Prefix:
*.*
- Access:
readwrite
然后点击Save
按钮。
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>
复制代码
hutool-all
是笔者比较喜欢用的一个工具类库,很大很全。强烈推荐。
2、 配置 Minio 属性
在项目配置文件application.properties
中配置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 —— Minio配置类。
@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
,精确到秒。第二个{}
放的是上传文件的原始文件名。
5、测试文件上传
上传成功后,我们就可以Minio后台管理系统中(路径:http://localhost:9020/buckets/my-bucket/browse
)看到上传的文件了。