springboot集成minio详细流程代码
maven依赖:
<!-- minio的官方依赖(目前最新) -->
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.5.14</version>
<exclusions>
<exclusion>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.11.0</version> <!-- 确保使用4.11.0或更高版本 -->
</dependency>
yaml配置:
# MinIO 配置
minio:
endpoint: http://xxx.xx.xx.xx:9000
accesskey: admin
secretKey: xxxx
bucketName: work
connectTimeout: 60000
writeTimeout: 60000
readTimeout: 60000
package com.r.minio.config;
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @Auther: ZHANG PU
* @Date: 2025/6/12 09:10
* @Description:
*/
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endpoint;
@Value("${minio.accesskey}")
private String accessKey;
@Value("${minio.secretKey}")
private String secretKey;
@Bean
public MinioClient minioClient() {
return MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
}
}
package com.r.minio.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* @Auther: ZHANG PU
* @Date: 2025/6/12 09:53
* @Description:
*/
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String bucketName;
private Integer connectTimeout;
private Integer writeTimeout;
private Integer readTimeout;
public String getEndpoint() {
return endpoint;
}
public void setEndpoint(String endpoint) {
this.endpoint = endpoint;
}
public String getAccessKey() {
return accessKey;
}
public void setAccessKey(String accessKey) {
this.accessKey = accessKey;
}
public String getSecretKey() {
return secretKey;
}
public void setSecretKey(String secretKey) {
this.secretKey = secretKey;
}
public String getBucketName() {
return bucketName;
}
public void setBucketName(String bucketName) {
this.bucketName = bucketName;
}
public Integer getConnectTimeout() {
return connectTimeout;
}
public void setConnectTimeout(Integer connectTimeout) {
this.connectTimeout = connectTimeout;
}
public Integer getWriteTimeout() {
return writeTimeout;
}
public void setWriteTimeout(Integer writeTimeout) {
this.writeTimeout = writeTimeout;
}
public Integer getReadTimeout() {
return readTimeout;
}
public void setReadTimeout(Integer readTimeout) {
this.readTimeout = readTimeout;
}
}
package com.r.minio.service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.Map;
/**
* @Auther: ZHANG PU
* @Date: 2025/6/12 10:01
* @Description:
*/
public interface MinioService {
/**
* 上传文件
*/
String uploadFile(MultipartFile file);
/**
* 上传文件到指定存储桶
*/
String uploadFile(MultipartFile file, String bucketName);
/**
* 功能描述: 上传文件到指定目录指定桶
*
* @param file
* @param path 文件路径 xxx/xxx/
* @param bucketName
* @author zhang pu
* @date 10:32 2025/6/12
*/
String uploadFile(MultipartFile file, String path, String bucketName);
/**
* 上传文件并设置元数据
*/
String uploadFile(MultipartFile file, Map<String, String> metadata);
/**
* 上传文件流
*/
String uploadFile(InputStream stream, String fileName, String contentType);
/**
* 功能描述: 获取文件访问url
*
* @param objectName
* @author zhang pu
* @date 10:40 2025/6/12
*/
String getObjectUrl(String objectName);
/**
* 获取文件访问URL(带过期时间)
*/
String getObjectUrl(String objectName, Integer expires);
/**
* 删除文件
*/
boolean removeFile(String objectName);
/**
* 功能描述: 删除文件如果又目录必须带上目录
*
* @param bucketName
* @param objectName
* @author zhang pu
* @date 10:39 2025/6/12
*/
boolean removeFile(String bucketName, String objectName);
/**
* 功能描述: 检查桶是否存在
*
* @param bucketName
* @author zhang pu
* @date 10:39 2025/6/12
*/
boolean bucketExists(String bucketName);
/**
* 功能描述: 创建桶
*
* @param bucketName
* @author zhang pu
* @date 10:39 2025/6/12
*/
void makeBucket(String bucketName);
}
package com.r.minio.service.impl;
import com.r.minio.service.MinioService;
import com.r.minio.properties.MinioProperties;
import io.minio.*;
import io.minio.http.Method;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.InputStream;
import java.util.Map;
import java.util.UUID;
/**
* @Auther: ZHANG PU
* @Date: 2025/6/12 10:02
* @Description:
*/
@Slf4j
@Service
public class MinioServiceImpl implements MinioService {
@Autowired
private MinioClient minioClient;
@Autowired
private MinioProperties minioProperties;
@Override
public String uploadFile(MultipartFile file) {
return uploadFile(file, minioProperties.getBucketName());
}
@Override
public String uploadFile(MultipartFile file,String path ,String bucketName) {
try
{
// 检查存储桶是否存在
if (!bucketExists(bucketName))
{
makeBucket(bucketName);
}
// 生成文件名
String originalFilename = file.getOriginalFilename();
assert originalFilename != null;
String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传文件
PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(path+fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
minioClient.putObject(args);
log.info("文件上传成功: {}", fileName);
return fileName;
} catch (Exception e)
{
log.error("文件上传失败: {}", e.getMessage(), e);
throw new RuntimeException("文件上传失败", e);
}
}
@Override
public String uploadFile(MultipartFile file, String bucketName) {
try
{
// 检查存储桶是否存在
if (!bucketExists(bucketName))
{
makeBucket(bucketName);
}
// 生成文件名
String originalFilename = file.getOriginalFilename();
assert originalFilename != null;
String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传文件
PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build();
minioClient.putObject(args);
log.info("文件上传成功: {}", fileName);
return fileName;
} catch (Exception e)
{
log.error("文件上传失败: {}", e.getMessage(), e);
throw new RuntimeException("文件上传失败", e);
}
}
@Override
public String uploadFile(MultipartFile file, Map<String, String> metadata) {
try
{
// 检查存储桶是否存在
String bucketName = minioProperties.getBucketName();
if (!bucketExists(bucketName))
{
makeBucket(bucketName);
}
// 生成文件名
String originalFilename = file.getOriginalFilename();
assert originalFilename != null;
String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
// 上传文件并设置元数据
PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).userMetadata(metadata).build();
minioClient.putObject(args);
log.info("文件上传成功: {}", fileName);
return fileName;
} catch (Exception e)
{
log.error("文件上传失败: {}", e.getMessage(), e);
throw new RuntimeException("文件上传失败", e);
}
}
@Override
public String uploadFile(InputStream stream, String fileName, String contentType) {
try
{
// 检查存储桶是否存在
String bucketName = minioProperties.getBucketName();
if (!bucketExists(bucketName))
{
makeBucket(bucketName);
}
// 上传文件 10MB 分片
PutObjectArgs args = PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(stream, -1, 10485760).contentType(contentType).build();
minioClient.putObject(args);
log.info("文件上传成功: {}", fileName);
return fileName;
} catch (Exception e)
{
log.error("文件上传失败: {}", e.getMessage(), e);
throw new RuntimeException("文件上传失败", e);
}
}
@Override
public String getObjectUrl(String objectName) {
// 默认7天过期
return getObjectUrl(objectName, 7 * 24 * 60 * 60);
}
@Override
public String getObjectUrl(String objectName, Integer expires) {
try
{
GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder().method(Method.GET).bucket(minioProperties.getBucketName()).object(objectName).expiry(expires).build();
return minioClient.getPresignedObjectUrl(args);
} catch (Exception e)
{
log.error("获取文件URL失败: {}", e.getMessage(), e);
throw new RuntimeException("获取文件URL失败", e);
}
}
@Override
public boolean removeFile(String objectName) {
return removeFile(minioProperties.getBucketName(), objectName);
}
@Override
public boolean removeFile(String bucketName, String objectName) {
try
{
RemoveObjectArgs args = RemoveObjectArgs.builder().bucket(bucketName).object(objectName).build();
minioClient.removeObject(args);
log.info("文件删除成功: {}", objectName);
return true;
} catch (Exception e)
{
log.error("文件删除失败: {}", e.getMessage(), e);
return false;
}
}
@Override
public boolean bucketExists(String bucketName) {
try
{
BucketExistsArgs args = BucketExistsArgs.builder().bucket(bucketName).build();
return minioClient.bucketExists(args);
} catch (Exception e)
{
log.error("检查存储桶是否存在失败: {}", e.getMessage(), e);
return false;
}
}
@Override
public void makeBucket(String bucketName) {
try
{
MakeBucketArgs args = MakeBucketArgs.builder().bucket(bucketName).build();
minioClient.makeBucket(args);
log.info("创建存储桶成功: {}", bucketName);
} catch (Exception e)
{
log.error("创建存储桶失败: {}", e.getMessage(), e);
throw new RuntimeException("创建存储桶失败", e);
}
}
}
原文地址:https://blog.csdn.net/weixin_42456784/article/details/148606220
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!
