MinIO社区版文件预览失效?一招解决

一觉醒来天塌了

最新版本minio已经升级为社区版本,无法分享长期有效的预览文件url了~~~~

以下是针对 MinIO 最新版本中桶策略配置问题的解决方案,采用编程方式实现公开访问权限:

创建桶的时候 AWS SDK 配置桶策略

java 复制代码
@Configuration
public class AmazonS3Config {
    @Resource
    private MinioProperties minioProperties;

    @Bean
    public AmazonS3 amazonS3Client() {
        ClientConfiguration config = new ClientConfiguration();
        config.setProtocol(Protocol.HTTP);
        config.setConnectionTimeout(5000);
        config.setUseExpectContinue(true);
        
        AWSCredentials credentials = new BasicAWSCredentials(
            minioProperties.getAccessKey(), 
            minioProperties.getAccessSecret()
        );

        AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration(
            minioProperties.getEndpoint(), 
            Regions.US_EAST_1.name()
        );

        AmazonS3 amazonS3 = AmazonS3ClientBuilder.standard()
            .withClientConfiguration(config)
            .withCredentials(new AWSStaticCredentialsProvider(credentials))
            .withEndpointConfiguration(endpoint)
            .withPathStyleAccessEnabled(true)
            .build();

        setupPublicBucket(amazonS3);
        return amazonS3;
    }

    private void setupPublicBucket(AmazonS3 client) {
        String bucketName = minioProperties.getBucket();
        if (!client.doesBucketExistV2(bucketName)) {
            CreateBucketRequest request = new CreateBucketRequest(bucketName);
            request.withCannedAcl(CannedAccessControlList.PublicRead);
            client.createBucket(request);
            
            String policy = generateBucketPolicy(bucketName);
            client.setBucketPolicy(bucketName, policy);
        }
    }

    private String generateBucketPolicy(String bucketName) {
        return String.format("""
            {
                "Version":"2012-10-17",
                "Statement":[{
                    "Sid":"PublicRead",
                    "Effect":"Allow",
                    "Principal":"*",
                    "Action":["s3:GetObject"],
                    "Resource":"arn:aws:s3:::%s/*"
                }]
            }""", bucketName);
    }
}

属性配置类

java 复制代码
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
    private String endpoint;
    private String accessKey;
    private String accessSecret;
    private String bucket;
    private String outEndpoint;
}

配置要点说明

确保application.ymlapplication.properties包含以下配置:

yaml 复制代码
minio:
  endpoint: http://your-minio-server:9000
  access-key: YOUR_ACCESS_KEY
  access-secret: YOUR_SECRET_KEY
  bucket: your-bucket-name
  out-endpoint: http://public-access-url:9000

注意事项

  • 策略中的Resource字段必须包含桶名称和通配符(arn:aws:s3:::bucket-name/*
  • 使用withPathStyleAccessEnabled(true)确保兼容MinIO的路径式访问
  • 新版本MinIO推荐使用编程方式配置策略,而非手动修改
  • 如果已存在桶,需要先删除旧策略再设置新策略

测试验证方法

上传文件后尝试通过以下URL格式直接访问:

复制代码
http://your-minio-server:9000/bucket-name/object-key

或使用配置的outEndpoint作为公开访问地址。

相关推荐
带刺的坐椅10 分钟前
老码农教你:Solon + EasyExcel 导出工具
java·excel·solon·easyexcel
迷知悟道20 分钟前
java面向对象的四大核心特征之继承---超详细(保姆级)
java
lixn21 分钟前
深入理解JVM字节码:invokedynamic
java·jvm
数据智能老司机24 分钟前
探索Java 全新的线程模型——结构化并发
java·性能优化·架构
数据智能老司机25 分钟前
探索Java 全新的线程模型——作用域值
java·性能优化·架构
数据智能老司机27 分钟前
探索Java 全新的线程模型——并发模式
java·性能优化·架构
何中应31 分钟前
分布式事务的两种解决方案
java·分布式·后端
数据智能老司机33 分钟前
探索Java 全新的线程模型——虚拟线程
java·性能优化·架构
SimonKing1 小时前
无需重启!动态修改日志级别的神技,运维开发都哭了
java·后端·程序员
杨杨杨大侠2 小时前
第3篇:配置管理的艺术 - 让框架更灵活
java·spring·log4j