maven
2025-09-19 2cfd0045a109b01ac890f0f2e968cbb44415d0ac
src/main/java/com/ruoyi/common/utils/MinioUtils.java
@@ -21,12 +21,10 @@
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -306,4 +304,86 @@
        return null;
    }
    /**
     * 生成预览URL
     * @param bucketFilename 文件在MinIO中的唯一标识
     * @param bucketName 存储桶名称
     * @param useDefaultExpiry 是否使用默认过期时间(true=使用默认过期时间,false=永久有效)
     * @return 预览URL
     */
    public String getPreviewUrls(String bucketFilename, String bucketName, boolean useDefaultExpiry) {
        if (StringUtils.isBlank(bucketFilename)) {
            return null;
        }
        try {
            // 验证文件存在性
            minioClient.statObject(StatObjectArgs.builder()
                    .bucket(bucketName)
                    .object(bucketFilename)
                    .build());
            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(bucketFilename);
            // 设置过期时间:useDefaultExpiry=true 使用配置的过期时间
            if (useDefaultExpiry) {
                builder.expiry(previewExpiry, TimeUnit.HOURS);
            }
            return minioClient.getPresignedObjectUrl(builder.build());
        } catch (Exception e) {
            throw new UtilException("生成预览URL失败: " + e.getMessage(), e);
        }
    }
    /**
     * 生成下载URL(强制浏览器下载)
     * @param bucketFilename 文件在MinIO中的唯一标识
     * @param bucketName 存储桶名称
     * @param originalFileName 原始文件名(用于下载时显示)
     * @param useDefaultExpiry 是否使用默认过期时间(true=使用默认,false=无过期时间)
     * @return 下载URL
     */
    public String getDownloadUrls(String bucketFilename, String bucketName, String originalFileName, boolean useDefaultExpiry) {
        if (StringUtils.isBlank(bucketFilename)) {
            return null;
        }
        try {
            // 验证文件存在性
            minioClient.statObject(StatObjectArgs.builder()
                    .bucket(bucketName)
                    .object(bucketFilename)
                    .build());
            // 正确编码文件名:替换 + 为 %20
            String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8)
                    .replace("+", "%20");
            Map<String, String> reqParams = new HashMap<>();
            reqParams.put("response-content-disposition",
                    "attachment; filename=\"" + encodedFileName + "\"");
            GetPresignedObjectUrlArgs.Builder builder = GetPresignedObjectUrlArgs.builder()
                    .method(Method.GET)
                    .bucket(bucketName)
                    .object(bucketFilename)
                    .extraQueryParams(reqParams);
            // 根据参数决定是否设置过期时间
            if (useDefaultExpiry) {
                // 使用默认过期时间(从配置读取)
                builder.expiry(previewExpiry, TimeUnit.HOURS);
            } else {
                // 不设置过期时间(MinIO 默认7天)
            }
            return minioClient.getPresignedObjectUrl(builder.build());
        } catch (Exception e) {
            throw new UtilException("生成下载URL失败: " + e.getMessage(), e);
        }
    }
}