Spring Boot | Spring Boot整合Minio实现文件上传

携手创作,共同成长!这是我参与「掘金日新计划 · 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、测试文件上传

image-20220627131329415

上传成功后,我们就可以Minio后台管理系统中(路径:http://localhost:9020/buckets/my-bucket/browse)看到上传的文件了。

猜你喜欢

转载自juejin.im/post/7128582141646110757