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

如何通过Java代码将S3文件URL设置为公开可访问?

嘿,我来帮你解决S3文件无法公开访问的问题!其实核心就是给目标文件配置公开读取权限,下面分两种场景给你Java代码实现,覆盖主流的AWS SDK版本:


场景1:上传文件时直接设置公开权限(推荐)

最好在上传阶段就一步到位,避免后续额外操作。

AWS SDK for Java 2.x(当前官方推荐版本)

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.PutObjectRequest;
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;
import java.nio.file.Paths;

public class S3PublicUpload {
    public static void main(String[] args) {
        String bucketName = "your-bucket-name";
        String objectKey = "your-file-name.jpg";
        String filePath = "/path/to/your/local/file.jpg";
        Region region = Region.US_EAST_1; // 替换成你的桶所在区域

        try (S3Client s3Client = S3Client.builder().region(region).build()) {
            PutObjectRequest putObjectRequest = PutObjectRequest.builder()
                    .bucket(bucketName)
                    .key(objectKey)
                    .acl(ObjectCannedACL.PUBLIC_READ) // 关键:设置公开读取权限
                    .build();

            s3Client.putObject(putObjectRequest, Paths.get(filePath));
            System.out.println("文件已上传并设置为公开,URL:https://" + bucketName + ".s3." + region.id() + ".amazonaws.com/" + objectKey);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

AWS SDK for Java 1.x(旧版本兼容)

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;
import com.amazonaws.services.s3.model.PutObjectRequest;
import java.io.File;

public class S3PublicUploadV1 {
    public static void main(String[] args) {
        String bucketName = "your-bucket-name";
        String objectKey = "your-file-name.jpg";
        String filePath = "/path/to/your/local/file.jpg";
        Regions region = Regions.US_EAST_1;

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withCredentials(new DefaultAWSCredentialsProviderChain())
                .withRegion(region)
                .build();

        PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectKey, new File(filePath))
                .withCannedAcl(CannedAccessControlList.PublicRead); // 设置公开权限

        s3Client.putObject(putObjectRequest);
        System.out.println("文件已上传并设置为公开,URL:https://" + bucketName + ".s3." + region.getName() + ".amazonaws.com/" + objectKey);
    }
}

场景2:给已上传的文件修改权限

如果文件已经在S3里了,直接修改它的ACL权限即可:

AWS SDK for Java 2.x

import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.model.SetObjectAclRequest;
import software.amazon.awssdk.services.s3.model.ObjectCannedACL;

public class UpdateS3ObjectAcl {
    public static void main(String[] args) {
        String bucketName = "your-bucket-name";
        String objectKey = "existing-file.jpg";
        Region region = Region.US_EAST_1;

        try (S3Client s3Client = S3Client.builder().region(region).build()) {
            SetObjectAclRequest setObjectAclRequest = SetObjectAclRequest.builder()
                    .bucket(bucketName)
                    .key(objectKey)
                    .acl(ObjectCannedACL.PUBLIC_READ)
                    .build();

            s3Client.setObjectAcl(setObjectAclRequest);
            System.out.println("已成功将文件设置为公开访问!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

AWS SDK for Java 1.x

import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.CannedAccessControlList;

public class UpdateS3ObjectAclV1 {
    public static void main(String[] args) {
        String bucketName = "your-bucket-name";
        String objectKey = "existing-file.jpg";
        Regions region = Regions.US_EAST_1;

        AmazonS3 s3Client = AmazonS3ClientBuilder.standard()
                .withCredentials(new DefaultAWSCredentialsProviderChain())
                .withRegion(region)
                .build();

        s3Client.setObjectAcl(bucketName, objectKey, CannedAccessControlList.PublicRead);
        System.out.println("已成功将文件设置为公开访问!");
    }
}

重要注意事项

  • 确保你的IAM用户拥有s3:PutObject和s3:PutObjectAcl权限,否则会遇到权限拒绝错误。
  • 除非你确定桶内所有文件都需要公开,否则不要给整个桶设置公开策略,单个对象配置ACL更安全。
  • 公开后的文件URL格式通常是:https://<bucket-name>.s3.<region>.amazonaws.com/<object-key>,直接访问这个URL就能从任意位置打开文件了。

内容的提问来源于stack exchange,提问作者Deepak N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:49:33