Springboot整合Minio,2024版教程
介绍
CSDN里面找资料真的是垃圾堆里刨食吃。优质作者和内容非常少,最近还出现了评论下方打广告的,粉丝上w,文章内容质量主打一个抄袭,乱写。真的难评价。
我为什么写这个?是因为我看了下搜到文章,内容掐头去尾,主打一个说了好像又没说。
安装方式
代码
直接copy可使用。也可联系我Q:1101165230
pom
xml
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.4.6</version>
</dependency>
yml
yml
minio:
endpoint: http://192.168.20.18:9000 #访问地址
username: guoshun #用户名
password: guoshun123... #密码
bucket: project.apply #存储文件夹名称
config
java
import io.minio.MinioClient;
import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @version 1.0.0
* @description minioConfig
* @date 2024/4/4 10:44
* @created by Guoshun
*/
@Log4j2
@Configuration
public class MinioConfig {
@Value("${minio.endpoint}")
private String endPoint;
@Value("${minio.username}")
private String username;
@Value("${minio.password}")
private String password;
@Bean
public MinioClient minioClient() {
MinioClient minioClient = MinioClient.builder()
.endpoint(endPoint)
.credentials(username, password)
.build();
log.info("minioClient initialized.");
return minioClient;
}
}
MinioService
java
import io.minio.*;
import io.minio.errors.*;
import io.minio.http.Method;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.concurrent.TimeUnit;
/**
* @version 1.0.0
* @description minio启动时创建bucket
* @date 2024/4/4 14:00
* @created by Guoshun
*/
@Slf4j
@Component
public class MinioService {
@Resource
private MinioClient minioClient;
@Value("${minio.bucket}")
private String bucketName;
/**
* 创建bucket
* @return Boolean true成功 false 失败
*/
@PostConstruct
public Boolean createBucket(){
BucketExistsArgs bucketExistsArgs = BucketExistsArgs.builder()
.bucket(bucketName).build();
try {
boolean existsFlag = minioClient.bucketExists(bucketExistsArgs);
if(!existsFlag){
MakeBucketArgs makeBucketArgs = MakeBucketArgs.builder().bucket(bucketName).build();
minioClient.makeBucket(makeBucketArgs);
}
}catch (Exception e){
e.printStackTrace();
log.error("Minio的bucket初始化失败{}", bucketName);
return false;
}
return true;
}
/**
* 文件上传
* @param inputStream
* @param contentType
* @param fileName
* @return
*/
public Boolean put(InputStream inputStream, String contentType, String fileName) throws IOException {
try {
PutObjectArgs stream = PutObjectArgs.builder()
.object(fileName)
.bucket(bucketName)
.contentType(contentType)
.stream(inputStream, inputStream.available(), -1).build();
minioClient.putObject(stream);
return true;
}catch (Exception e){
log.error("文件上传失败,文件{}", fileName);
throw new RuntimeException(e.getMessage());
}finally {
if(inputStream != null){
inputStream.close();
}
}
}
/**
* 获取文件的url地址
* 支持版本管理后续增加
*
* @param fileName
*/
public String getDownloadUrl(String fileName) {
GetPresignedObjectUrlArgs presignedObjectUrlArgs = GetPresignedObjectUrlArgs.builder()
.bucket(bucketName).object(fileName).method(Method.GET).expiry(1, TimeUnit.HOURS).build();
try {
String downloadUrl = minioClient.getPresignedObjectUrl(presignedObjectUrlArgs);
return downloadUrl;
} catch (ServerException |
InsufficientDataException | ErrorResponseException |
IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e) {
log.error("文件下载失败{}", fileName);
throw new RuntimeException(e.getMessage());
}
}
/**
* 获取文件流
* 后续支持写入抬头
*
* @param fileName
*/
public ByteArrayOutputStream getDownloadFile(String fileName) throws IOException {
GetObjectArgs getObjectArgs = GetObjectArgs.builder().object(fileName).bucket(bucketName).build();
byte[] buf = new byte[1024];
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
try {
GetObjectResponse downloadUrl = minioClient.getObject(getObjectArgs);
int length = 0;
while ((length = downloadUrl.read(buf)) > 0) {
outputStream.write(buf, 0, length);
}
return outputStream;
} catch (ServerException |
InsufficientDataException | ErrorResponseException |
IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e) {
log.error("文件下载失败{}", fileName);
throw new RuntimeException(e.getMessage());
} finally {
outputStream.close();
}
}
/**
* 文件删除
*
* @param key
*/
public boolean deleteFile(String key) {
RemoveObjectArgs removeObjectArgs = RemoveObjectArgs.builder().bucket(bucketName).object(key).build();
try {
minioClient.removeObject(removeObjectArgs);
} catch (ServerException |
InsufficientDataException | ErrorResponseException |
IOException | NoSuchAlgorithmException | InvalidKeyException | InvalidResponseException | XmlParserException | InternalException e){
log.error("文件删除失败{}", key);
throw new RuntimeException(e.getMessage());
}
return true;
}
}