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; } } }