java – 如何在S3中设置文件夹中所有文件的ACL

我想使用Java为S3中的文件夹内的所有文件提供读取权限.我正在使用TransferManager进行文件夹上传,但我没有找到任何API来在目录级别设置ACL

MultipleFileUpload upload = transferManager.uploadDirectory(bucketName,uploadDirectory,new File(folderName),true);

我知道我可以使用以下方法设置S3对象的ACL:
s3.setObjectAcl(bucketName,key,acl);

但我想在文件夹中一次对所有文件执行此操作.有什么办法吗?

最佳答案
在S3中,没有文件夹,只有桶和密钥.为方便起见,共享一个共同前缀的键在控制台中组合在一起,但在引擎盖下,结构完全平坦.因此,无法为文件夹设置ACL.但是有一些解决方法.

使用存储桶策略

根据您要授予的权限和权限,您可以使用存储桶策略授予“文件夹”中所有密钥的访问权限.此示例允许任何人从存储桶my-bucket获取文件夹路径/ to / folder /下的任何密钥.这是文档中的list of possible actionslist of possible principals.

{
    "Version":"2012-10-17",
    "Statement":[
        {
            "Sid":"SimulateFolderACL",
            "Effect":"Allow",
            "Principal": "*",
            "Action":["s3:GetObject"],
            "Resource":["arn:aws:s3:::my-bucket/path/to/folder/*"]
        }
    ]
}

迭代并将ACL应用于每个密钥

您也可以循环遍历所有键并直接应用ACL,就像您提到的那样使用s3.setObjectAcl(bucketName,key,acl).您可以按文件夹前缀过滤密钥,这样您就不必直接检查每个密钥名称.上传目录后,您可以执行以下操作:

// We only want the keys that are in the folder
ListObjectsRequest listObjectsRequest = new ListObjectsRequest()
                                            .withBucketName("my-bucket")
                                            .withPrefix("path/to/folder/");
ObjectListing objectListing;

// Iterate over all the matching keys     
do {
    objectListing = s3client.listObjects(listObjectsRequest);
    for (S3ObjectSummary objectSummary : objectListing.getObjectSummaries())
    {
            // Apply the ACL
            s3.setObjectAcl(bucketName, key, acl);
    }
    listObjectsRequest.setMarker(objectListing.getNextMarker());
} while (objectListing.isTruncated());

转载注明原文:java – 如何在S3中设置文件夹中所有文件的ACL - 代码日志