package com.webmanage.service;
|
|
import com.webmanage.common.FileUploadException;
|
import com.webmanage.config.MinioConfig;
|
import io.minio.*;
|
import io.minio.http.Method;
|
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.UUID;
|
import java.util.concurrent.TimeUnit;
|
|
/**
|
* MinIO服务类
|
*
|
* @author webmanage
|
* @date 2024-08-07
|
*/
|
@Slf4j
|
@Service
|
public class MinioService {
|
|
@Autowired
|
private MinioClient minioClient;
|
|
@Autowired
|
private MinioConfig minioConfig;
|
|
/**
|
* 上传文件
|
*/
|
public String uploadFile(MultipartFile file, String folder) {
|
try {
|
// 检查存储桶是否存在,不存在则创建
|
boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder()
|
.bucket(minioConfig.getBucketName())
|
.build());
|
|
if (!bucketExists) {
|
minioClient.makeBucket(MakeBucketArgs.builder()
|
.bucket(minioConfig.getBucketName())
|
.build());
|
}
|
|
// 生成文件名
|
String originalFilename = file.getOriginalFilename();
|
String fileExtension = "";
|
if (originalFilename != null && originalFilename.contains(".")) {
|
fileExtension = originalFilename.substring(originalFilename.lastIndexOf("."));
|
}
|
String fileName = folder + "/" + UUID.randomUUID().toString() + fileExtension;
|
|
// 上传文件
|
minioClient.putObject(PutObjectArgs.builder()
|
.bucket(minioConfig.getBucketName())
|
.object(fileName)
|
.stream(file.getInputStream(), file.getSize(), -1)
|
.contentType(file.getContentType())
|
.build());
|
|
log.info("文件上传成功: {}", fileName);
|
return fileName;
|
} catch (Exception e) {
|
log.error("文件上传失败: ", e);
|
throw new FileUploadException("文件上传失败: " + e.getMessage());
|
}
|
}
|
|
/**
|
* 下载文件
|
*/
|
public InputStream downloadFile(String fileName) {
|
try {
|
return minioClient.getObject(GetObjectArgs.builder()
|
.bucket(minioConfig.getBucketName())
|
.object(fileName)
|
.build());
|
} catch (Exception e) {
|
log.error("文件下载失败: ", e);
|
throw new FileUploadException("文件下载失败: " + e.getMessage());
|
}
|
}
|
|
/**
|
* 删除文件
|
*/
|
public void deleteFile(String fileName) {
|
try {
|
minioClient.removeObject(RemoveObjectArgs.builder()
|
.bucket(minioConfig.getBucketName())
|
.object(fileName)
|
.build());
|
log.info("文件删除成功: {}", fileName);
|
} catch (Exception e) {
|
log.error("文件删除失败: ", e);
|
throw new FileUploadException("文件删除失败: " + e.getMessage());
|
}
|
}
|
|
/**
|
* 生成文件预览URL
|
*/
|
public String getPreviewUrl(String fileName) {
|
try {
|
return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
|
.method(Method.GET)
|
.bucket(minioConfig.getBucketName())
|
.object(fileName)
|
.expiry(1, TimeUnit.HOURS)
|
.build());
|
} catch (Exception e) {
|
log.error("生成预览URL失败: ", e);
|
throw new FileUploadException("生成预览URL失败: " + e.getMessage());
|
}
|
}
|
|
/**
|
* 生成文件下载URL
|
*/
|
public String getDownloadUrl(String fileName) {
|
try {
|
return minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
|
.method(Method.GET)
|
.bucket(minioConfig.getBucketName())
|
.object(fileName)
|
.expiry(24, TimeUnit.HOURS)
|
.build());
|
} catch (Exception e) {
|
log.error("生成下载URL失败: ", e);
|
throw new FileUploadException("生成下载URL失败: " + e.getMessage());
|
}
|
}
|
|
/**
|
* 检查文件是否存在
|
*/
|
public boolean fileExists(String fileName) {
|
try {
|
minioClient.statObject(StatObjectArgs.builder()
|
.bucket(minioConfig.getBucketName())
|
.object(fileName)
|
.build());
|
return true;
|
} catch (Exception e) {
|
return false;
|
}
|
}
|
}
|