maven
2025-09-23 7fff9a9e14e06568933afa9af5168ffa9cdb3de9
src/main/java/com/ruoyi/common/utils/MinioUtils.java
@@ -361,7 +361,7 @@
                    .build());
            // 正确编码文件名:替换 + 为 %20
            String encodedFileName = URLEncoder.encode(originalFileName, StandardCharsets.UTF_8)
            String encodedFileName = URLEncoder.encode(originalFileName, String.valueOf(StandardCharsets.UTF_8))
                    .replace("+", "%20");
            Map<String, String> reqParams = new HashMap<>();
@@ -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;
    }
}