Amazon web services 多个文件的预签名url?
我已经编写了一个在aws-s3上为bucket生成预签名URL的实现。对于获取单个文件/对象,它工作得很好 如何为整个目录生成预签名URL?让我们这样说吧,在我的s3存储桶中,有多个文件夹和它们自己的小html5应用程序。每个文件夹都有自己的一组html、css、js以及媒体文件。在这种情况下,我不会为单个对象生成预先签名的URL 如果我为单个文件提供一个预先签名的url,例如:文件夹的index.html,那么该文件还需要加载css、js和媒体文件。没有签名url的文件 我只是不太确定如何实施这一点。第一件事: AWS S3是一个键值存储,每个对象Amazon web services 多个文件的预签名url?,amazon-web-services,amazon-s3,aws-sdk,Amazon Web Services,Amazon S3,Aws Sdk,我已经编写了一个在aws-s3上为bucket生成预签名URL的实现。对于获取单个文件/对象,它工作得很好 如何为整个目录生成预签名URL?让我们这样说吧,在我的s3存储桶中,有多个文件夹和它们自己的小html5应用程序。每个文件夹都有自己的一组html、css、js以及媒体文件。在这种情况下,我不会为单个对象生成预先签名的URL 如果我为单个文件提供一个预先签名的url,例如:文件夹的index.html,那么该文件还需要加载css、js和媒体文件。没有签名url的文件 我只是不太确定如何实施
aaa/bbb/ccc/ddd/index.html
只是一个名称。没有“文件夹”的概念(即使您可能会有一种错觉,认为它们存在于UI中)
为了为多个“文件”创建一个预先签名的url,您必须进行一些预处理。从本地提取所有必要的文件,压缩它们并将zip存档放在S3上,然后生成zip存档的预签名URL。否。预签名URL仅对一个对象有效。否,它们需要提供一个API,以允许您先上载多个文件。这是API的限制,不是预签名
请参阅。对于2021年关注此问题的其他人,我发现从S3存储桶下载整个“文件夹”文件的最简单方法是更改我上载“文件夹”的方式。我没有递归地上传,而是将对象压缩到一个zip存档中,然后上传zip存档。它不能直接回答问题,但可以快速解决。下面是我用来解决这个问题的python代码示例:
来自shutil import make_archive
来自boto3导入客户端
make\u archive(压缩文件夹的名称,'zip',指向\u outdir的路径)
然后将此压缩文件夹上载到s3
aws s3压缩文件夹的cp名称s3://bucket\u name/name\u压缩文件夹的名称
然后使用boto3代码为该压缩文件夹生成预先签名的URL
client('s3','us-east-1')。生成预签名的\u url('get\u object',Params={'Bucket':Bucket\u name,'Key':压缩的\u文件夹的名称},ExpiresIn=120)
这将为s3上的现有对象生成预签名的url。在本例中,您可以列出所有对象(使用keyName)并递归调用上述方法
public String generatePreSignedUrl(String bucketName, String keyName){
Date expiration = new Date();
long mSec = 60000l; //Time in millis
expiration.setTime(mSec);
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName);
generatePresignedUrlRequest.setMethod(HttpMethod.GET);
generatePresignedUrlRequest.setExpiration(expiration);
URL url = s3.generatePresignedUrl(generatePresignedUrlRequest);
return url.toString();
}
注:AWS SDK提供了API来列出存储桶下的对象&您可以选择所需的对象。这是绝对可能的,并且已经存在多年了。生成预签名的URL时必须使用
条件
,特别是以
开头。见官员
例如,下面是Python和Boto3生成一个预先签名的帖子url:
response = s3.generate_presigned_post(
"BUCKET_NAME",
"uploads/${filename}",
Fields=None,
Conditions=[["starts-with", "$key", "uploads/"]],
ExpiresIn=(10 * 60),
)
这是静态网站吗?是的。我知道预先签名的URL只适用于单个对象。我现在使用静态托管作为解决方案,但有些目录需要授权。通过查看aws文档,我可以创建IAM用户,这将很好地工作,因为我可以对他们进行分组,但这听起来像是出于开发目的,不一定是为了最终用户。从技术上讲,S3是一个没有文件夹的KV存储,但实际上那里确实存在“文件夹”。您已经可以设置bucket策略,以基本上设置文件夹上的策略。但预签名的URL(当前)不支持部分密钥路径。即使他们这样做了,也不会对OP有所帮助,因为HTML应用程序仍然链接到资源(css、js,在相同的键前缀下),而没有预先签名的URL。请谨慎使用键开始,但这是有效的!