SpringBoot 整合 Minio

码农老张 后端 2024-10-28

SpringBoot 整合 Minio

前置工作

需要在某个服务器安装一个Minio的Server服务。

Minio依赖xml

代码解读
复制代码
<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>8.3.0</version> </dependency>

MinioClient 配置类

yml配置yaml

代码解读
复制代码
# minio minio: # 服务地址 endpoint: http://localhost:9000 # 账号 accessKey: minioadmin # 密码 secretKey: minioadmin

Client配置类

这里把MinioClient注入到Bean中,后续使用MinioClient调用Minio的API。java

代码解读
复制代码
import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @Slf4j public class MinIoClientConfig { @Value("${minio.endpoint}") private String endpoint; @Value("${minio.accessKey}") private String accessKey; @Value("${minio.secretKey}") private String secretKey; /** * 注入minio 客户端 * @return */ @Bean public MinioClient minioClient(){ return MinioClient.builder() .endpoint(endpoint) .credentials(accessKey, secretKey) .build(); } }

Minio 的基本操作

在这里定义一个OSSFileService接口,用来抽象出Minio的具体实现。在这里要引入一个 桶(bucket) 的概念,这个桶是Minio用来划分不同数据的,你可以理解成文件夹,不过桶在这里有公开和私密的属性,公开的桶可以随便浏览,而私密的则需要给定一个浏览的时间,超过这个浏览的时间就不能再浏览了。

objectName 对象名称:对象名称可以理解成哪个文件夹下,哪个文件,对象名称例如: public/images/111.jpg

OSSFileServicejava

代码解读
复制代码
public interface FileService { /** * 上传文件 * * @param bucketName 存储桶名称 * @param input 文件流 * @param objectName 对象名称 * @param contentType contentType * @return */ void uploadFile(String bucketName, InputStream input, String objectName, String contentType); /** * 根据对象名称获取公共文件访问路径 * * @param bucketName 存储桶名称 * @param objectName 对象名称 */ String getUrlByBucketNameAndObjectName(String bucketName, String objectName); /** * 根据对象名称获取文件访问路径 * * @param bucketName 存储桶名称 * @param objectName 对象名称 * @param getUrlTime 访问文件路径时间 * @param timeUnit 访问时间格式 * @return */ String getUrlByBucketNameAndObjectNameAndTime(String bucketName, String objectName, int getUrlTime, TimeUnit timeUnit); /** * 根据对象名称和桶名称删除对象 * * @param bucketName 桶名称 * @param objectName 对象名称 * @return */ void remove(String bucketName, String objectName); }java
代码解读
复制代码
@Service public class OssFileServiceImpl implements OssFileService { @Autowired private MinioClient minioClient; @Override public void uploadFile(String bucketName, InputStream input, String objectName, String contentType) { try { minioClient.putObject( PutObjectArgs.builder() .bucket(bucketName) .object(objectName) .contentType(contentType) .stream(input, input.available(), -1) .build()); } catch (Exception e) { e.printStackTrace(); } finally { try { input.close(); } catch (IOException e) { e.printStackTrace(); } } } @Override public String getUrlByBucketNameAndObjectName(String bucketName, String objectName) { return this.getUrl(bucketName, objectName, 1, TimeUnit.DAYS); } @Override public String getUrlByBucketNameAndObjectNameAndTime(String bucketName, String objectName, int getUrlTime, TimeUnit timeUnit) { return this.getUrl(bucketName, objectName, getUrlTime, timeUnit); } @Override public void remove(String bucketName, String objectName) { try { minioClient.removeObject(RemoveObjectArgs.builder() .bucket(bucketName) .object(objectName) .build()); } catch (Exception e) { e.printStackTrace(); } } /** * 根据 桶、object、时间 获取文件路径 * * @param bucketName 桶名称 * @param objectName object * @param getUrlTime 时间 * @param timeUnit 时间格式 * @return */ private String getUrl(String bucketName, String objectName, int getUrlTime, TimeUnit timeUnit) { try { return minioClient.getPresignedObjectUrl( GetPresignedObjectUrlArgs.builder() .bucket(bucketName) .object(objectName) .expiry(getUrlTime, timeUnit) .method(Method.GET) .build()); } catch (Exception e) { e.printStackTrace(); } return null; } }

转载来源:https://juejin.cn/post/7394277275321598003

Apipost 私有化火热进行中

评论