You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Minio预签名URL7天过期问题:Java实现永久可访问链接需求

解决Minio文件URL7天后失效问题,生成永久访问链接

方案一:将Bucket设为公开可读(推荐,适合无需权限控制的场景)

操作步骤

    1. 配置Bucket权限:登录Minio控制台,找到目标Bucket,进入「Permissions」页面,添加规则允许allUsers拥有read权限,或者直接将Bucket设置为公开读。
    1. 代码中直接构造永久URL,替代默认的预签名临时URL。

修改后的完整代码:

public Boolean uploadFile(List<MultipartFile> multipartFiles, Product product) {
    LinkedList<AppFile> appFiles = new LinkedList<>();
    // 替换为你的Minio服务基础访问地址,本地测试一般是http://localhost:9000
    String minioBaseUrl = "http://localhost:9000";
    
    multipartFiles.forEach(multipartFile -> {
        String fileName = multipartFile.getOriginalFilename();
        String ext = FileNameUtils.getExtension(fileName);
        AppFile appFile = new AppFile();
        appFile.setName(fileName);
        appFile.setExt(ext);
        appFile.setDateCreated(new Date());
        appFile.setUserId(UUID.randomUUID().toString());
        appFile.setUuid(UUID.randomUUID().toString());  

        try {
            UUID uuid = UUID.randomUUID();
            String objectName = uuid + "-" + multipartFile.getOriginalFilename();
            
            // 上传文件到Minio
            minioClient.putObject(PutObjectArgs.builder()
                    .bucket(bucketName)
                    .object(objectName)
                    .stream(multipartFile.getInputStream(), multipartFile.getSize(), -1)
                    .contentType(multipartFile.getContentType())
                    .build());

            // 构造永久公开URL
            String permanentUrl = String.format("%s/%s/%s", minioBaseUrl, bucketName, objectName);
            appFile.setUrl(permanentUrl);
            appFile.setProductId(product);
            appFiles.add(appFile);
        } catch (Exception e) {
            throw new FileException(EnumFile.FILE_CAN_NOT_ADDED.getName() + " " + e.getMessage());
        }
    });
    // 将批量保存移到循环外,避免重复操作
    appFileRepository.saveAll(appFiles);
    return true;
}

注意事项

  • 确保Minio服务的访问地址正确,部署到服务器时替换为实际域名或公网IP。
  • 公开Bucket后,任何知道URL的用户都能访问文件,不适用于需要权限控制的敏感文件场景。

方案二:生成长期有效预签名URL(适合需要权限控制的场景)

如果不想公开Bucket,可以设置预签名URL的有效期为极长时间(比如100年),实现近似永久的访问效果。

仅修改代码中生成URL的部分:

// 生成有效期为100年的预签名URL
String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
        .method(Method.GET)
        .bucket(bucketName)
        .object(objectName)
        .expiry(365 * 100, TimeUnit.DAYS) // 设置有效期为100年
        .build());

注意事项

  • 该URL依赖Minio的Access Key和Secret Key,若密钥变更,旧URL会失效,需重新生成。
  • 签名URL仍具备权限控制能力,只有持有正确URL的用户才能访问文件。

内容的提问来源于stack exchange,提问作者shamil khalid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 14:16:45