liding
2026-04-23 1b3d13f691957d4fffdfb3671dc09f66b6e3dfd0
src/main/java/com/ruoyi/common/utils/MinioUtils.java
@@ -11,15 +11,15 @@
import io.minio.http.Method;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Autowired;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.FastByteArrayOutputStream;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
@@ -29,10 +29,10 @@
import java.util.stream.Collectors;
@Component
@RequiredArgsConstructor
public class MinioUtils {
    @Autowired
    private MinioClient minioClient;
    private final MinioClient minioClient;
    @Value("${minio.preview-expiry}")
    private Integer previewExpiry;
@@ -386,4 +386,48 @@
            throw new UtilException("生成下载URL失败: " + e.getMessage(), e);
        }
    }
    public String getDownloadUrl(String bucketFileName, String bucketName) {
        if (StringUtils.isNotBlank(bucketFileName)) {
            try {
                // 检查文件是否存在
                minioClient.statObject(StatObjectArgs.builder()
                        .bucket(bucketName)
                        .object(bucketFileName)
                        .build());
                // 设置响应头
                Map<String, String> reqParams = new HashMap<>();
                // 提取原始文件名(如果存储时保留了原始名称)
                String originalFileName = extractOriginalFileName(bucketFileName);
                reqParams.put("response-content-disposition",
                        "attachment; filename=\"" + URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8)) + "\"");
                // 构建预签名URL参数
                GetPresignedObjectUrlArgs args = GetPresignedObjectUrlArgs.builder()
                        .method(Method.GET)
                        .bucket(bucketName)
                        .object(bucketFileName)
                        .expiry(previewExpiry, TimeUnit.HOURS)
                        .extraQueryParams(reqParams)
                        .build();
                return minioClient.getPresignedObjectUrl(args);
            } catch (Exception e) {
                throw new UtilException("MinioUtils:生成下载链接异常", e);
            }
        }
        return null;
    }
    private String extractOriginalFileName(String bucketFileName) {
        // 示例:如果存储格式为 "原始文件名_UUID"
        int underscoreIndex = bucketFileName.lastIndexOf("_");
        if (underscoreIndex > 0) {
            return bucketFileName.substring(0, underscoreIndex);
        }
        // 如果没有特殊格式,直接返回完整文件名
        return bucketFileName;
    }
}