为多个文件预签名 url?
Pre-signed url for multiple files?
我已经编写了一个用于为 aws-s3 上的存储桶生成预签名 URLS 的实现。它工作正常,用于单身 files/objects.
如何为整个目录生成预签名的 URLS?让我们这样说吧,在我的 s3 存储桶上,有多个文件夹和它们自己的小 html5 应用程序。每个文件夹都有自己的一组 html、css、js 以及媒体文件。在这种情况下,我不会为单个对象生成预签名 URL。
如果我为单个文件提供预签名url,例如:为文件夹提供index.html,则该文件还需要加载css,js,和媒体文件。我们没有为 url 签名的文件。
我只是不太确定如何着手实施它。
首先要做的是:
AWS S3 是一个键值存储,每个对象 aaa/bbb/ccc/ddd/index.html
只是一个名称。没有 "folders" 的概念(即使您可能误以为它们存在于 UI )。
为了为多个 "files" 创建单个预签名 url,您必须进行一些预处理。在本地提取所有必要的文件,将它们压缩并将 zip 存档放在 S3 上,然后生成 zip 存档的预签名 URL。
没有。预签名 URL 仅对一个对象有效。
不,他们需要提供 API 以允许您先上传多个文件。这是API的限制,不是预签。
见Is it possible to perform a batch upload to amazon s3?。
对于 2021 年关注此问题的任何其他人 - 我发现从 S3 存储桶下载整个“文件夹”文件的最简单方法是更改我上传“文件夹”的方式。我没有递归上传,而是将对象压缩到一个 zip 存档中,然后上传 zip 存档。它不直接回答问题,而是一种快速解决方法。这是我用来解决这个问题的示例 python 代码:
from shutil import make_archive
from boto3 import client
make_archive(name_of_zipped_folder, 'zip', path_to_outdir)
然后将这个压缩文件夹上传到s3
aws s3 cp name_of_zipped_folder s3://bucket_name/name_of_zipped_folder
然后使用 boto3 代码为该压缩文件夹生成预签名 url
client('s3', 'us-east-1').generate_presigned_url('get_object', Params={'Bucket': bucket_name,'Key': name_of_zipped_folder}, 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();
}
PS:AWS SDK提供API列出桶下的对象,您可以选择需要的对象。
这绝对有可能,而且已经存在多年。生成预签名 URL 时必须使用 conditions
,特别是 starts-with
。见官方Amazon Documentation.
例如,这里是 Python,Boto3 生成预签名 POST url:
response = s3.generate_presigned_post(
"BUCKET_NAME",
"uploads/${filename}",
Fields=None,
Conditions=[["starts-with", "$key", "uploads/"]],
ExpiresIn=(10 * 60),
)
我已经编写了一个用于为 aws-s3 上的存储桶生成预签名 URLS 的实现。它工作正常,用于单身 files/objects.
如何为整个目录生成预签名的 URLS?让我们这样说吧,在我的 s3 存储桶上,有多个文件夹和它们自己的小 html5 应用程序。每个文件夹都有自己的一组 html、css、js 以及媒体文件。在这种情况下,我不会为单个对象生成预签名 URL。
如果我为单个文件提供预签名url,例如:为文件夹提供index.html,则该文件还需要加载css,js,和媒体文件。我们没有为 url 签名的文件。
我只是不太确定如何着手实施它。
首先要做的是:
AWS S3 是一个键值存储,每个对象 aaa/bbb/ccc/ddd/index.html
只是一个名称。没有 "folders" 的概念(即使您可能误以为它们存在于 UI )。
为了为多个 "files" 创建单个预签名 url,您必须进行一些预处理。在本地提取所有必要的文件,将它们压缩并将 zip 存档放在 S3 上,然后生成 zip 存档的预签名 URL。
没有。预签名 URL 仅对一个对象有效。
不,他们需要提供 API 以允许您先上传多个文件。这是API的限制,不是预签。
见Is it possible to perform a batch upload to amazon s3?。
对于 2021 年关注此问题的任何其他人 - 我发现从 S3 存储桶下载整个“文件夹”文件的最简单方法是更改我上传“文件夹”的方式。我没有递归上传,而是将对象压缩到一个 zip 存档中,然后上传 zip 存档。它不直接回答问题,而是一种快速解决方法。这是我用来解决这个问题的示例 python 代码:
from shutil import make_archive
from boto3 import client
make_archive(name_of_zipped_folder, 'zip', path_to_outdir)
然后将这个压缩文件夹上传到s3
aws s3 cp name_of_zipped_folder s3://bucket_name/name_of_zipped_folder
然后使用 boto3 代码为该压缩文件夹生成预签名 url
client('s3', 'us-east-1').generate_presigned_url('get_object', Params={'Bucket': bucket_name,'Key': name_of_zipped_folder}, 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();
}
PS:AWS SDK提供API列出桶下的对象,您可以选择需要的对象。
这绝对有可能,而且已经存在多年。生成预签名 URL 时必须使用 conditions
,特别是 starts-with
。见官方Amazon Documentation.
例如,这里是 Python,Boto3 生成预签名 POST url:
response = s3.generate_presigned_post(
"BUCKET_NAME",
"uploads/${filename}",
Fields=None,
Conditions=[["starts-with", "$key", "uploads/"]],
ExpiresIn=(10 * 60),
)