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

Viv*_*vek 4 java amazon-s3 amazon-web-services aws-sdk

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

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

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

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

Dav*_*les 12

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

使用存储桶策略

根据您要授予的权限和权限,您可以使用存储桶策略授予"文件夹"中所有密钥的访问权限.此示例允许任何人path/to/folder/从存储桶中获取该文件夹下的任何密钥my-bucket.这里是一个 可能的操作列表和一个可能的校长名单从文档.

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

迭代并将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());
Run Code Online (Sandbox Code Playgroud)

  • 这是一个高质量的答案,展示了真正的专业知识,“原则”和“行动”资源的链接是额外的接触,是我欣赏的那种彻底性的典范。 (3认同)