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,就像您提到的那样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)