为多个文件预签名 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),
    )