为了在项目中实现文件的管理,我们打算在项目中使用minio对象存储服务。如何搭建minio服务,可以查看Docker compose快速部署minio服务。
在minio服务搭建好的情况下,我们要准备在springboot项目当中集成minio SDK,以便我们项目中的文件能全部交由minio服务来管理。
准备工作
访问http://ip:9001
,通过管理员用户名密码登陆。
- 创建文件桶
从正常项目管理的角度来看,我们一般会提前把文件桶创建好。在团队开发中制定规范,达成共识,确定当前项目对应的文件桶名称,不同业务类型的文件放在什么名称的文件夹下面。
比如以当前项目名称创建一个文件桶,在这个文件桶里面再创建不同的文件夹,类似image、vedio等。这样的话,我们针对头像、音视频等文件就可以放到指定的文件夹里面了。 - 创建指定的用户,赋予对应的权限
先把需要创建的用户名和密码填好,其他可暂时不选,然后创建用户。
其次创建权限:
1.点击左侧栏Access;
2.点击Create Policy
;
权限配置:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::awesome-spring" ] }, { "Effect": "Allow", "Action": [ "s3:*" ], "Resource": [ "arn:aws:s3:::awesome-spring/*" ] } ] } 复制代码
首先awesome-spring
是文件桶的名称,里面一共包含两段权限:
- 第一段权限是允许在
awesome-spring
文件桶中执行GetBucketLocation
、GetObject(下载)
、PutObject
(上传)操作,基本上满足上传下载的业务。 - 第二段权限是允许在
awesome-spring
的子文件夹中做所有的操作。我们可以根据实际情况把权限设置得更细粒度。
权限和用户都创建完毕后,我们再回到用户列表,我们需要做的步骤就是把用户和权限关联起来:
- 通过以上步骤,我们把权限和用户关联起来了,这样的话,我们新创建的这个用户就有了操作这个bucket的权限了。
如果团队人员比较多的话,我建议通过创建Group的方式,给对应的Group赋予权限,最后把新创建的用户放进Group,这样的话,可以避免一个一个给用户配置权限。 - 创建开发需要的AccessKey和SecretKey
当我们拿到新创建的用户后,登陆http://ip:9001
我们可以看到,目前的新用户只能看到当前拥有权限的bucket。
接下来,我们立马创建一个service account
来为我们顺利使用minio SDK作准备:
【注意】secret key只有再第一次创建的时候会显示,创建成功后就无法查看,建议下载下来保存好。
Minio SDK依赖
想要把Minio服务集成到springboot项目中,我们可以通过它所提供的SDK来做的,下面我们找到了Maven依赖:
<!--minio文件存储--> <dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.4.3</version> </dependency> 复制代码
如果是gradle或者其他依赖管理工具可以去mvnrepository.com/artifact/io… 查找相关的依赖。
文件上传下载功能实现
- 准备自定义minio config
minio: config: # 请填写自己minio服务的ip和端口 endpoint: "http://ip:9000" bucket-name: 文件桶名称 access-key: "pXLVexkIGrvhfPbC" secret-key: "wcI9GE9UeX4qVQik2dV9zK6DkeZVZ3TR" 复制代码
- 通过springboot的ConfigurationProperties的功能,将配置转换成java bean:
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * @author zouwei * @className MinioConfigProperties * @date: 2022/8/4 下午4:35 * @description: */ @Data @Configuration @ConfigurationProperties(prefix = "minio.config") public class MinioConfigProperties { /** * minio服务API访问入口 */ private String endpoint; /** * 桶名称 */ private String bucketName; /** * 公钥 */ private String accessKey; /** * 私钥 */ private String secretKey; } 复制代码
- 实例化minio client
import io.minio.MinioClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @author zouwei * @className MinioConfig * @date: 2022/8/4 下午4:27 * @description: */ @Configuration public class MinioConfig { @Autowired private MinioConfigProperties properties; @Bean public MinioClient minioClient() { return MinioClient.builder() .credentials(properties.getAccessKey(), properties.getSecretKey()) .endpoint(properties.getEndpoint()) .build(); } } 复制代码
- 通过java config的方式把MinioClient实例化交给spring ioc容器来管理,接下来就可以直接在spring框架体系下正常使用SDK的功能了。