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 actions和list 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,amazon-web-services,amazon-s3,aws-sdk 来源: https://codeday.me/bug/20190717/1488660.html