Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 多个文件的预签名url?_Amazon Web Services_Amazon S3_Aws Sdk - Fatal编程技术网

Amazon web services 多个文件的预签名url?

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的文件 我只是不太确定如何实施

我已经编写了一个在aws-s3上为bucket生成预签名URL的实现。对于获取单个文件/对象,它工作得很好

如何为整个目录生成预签名URL?让我们这样说吧,在我的s3存储桶中,有多个文件夹和它们自己的小html5应用程序。每个文件夹都有自己的一组html、css、js以及媒体文件。在这种情况下,我不会为单个对象生成预先签名的URL

如果我为单个文件提供一个预先签名的url,例如:文件夹的index.html,那么该文件还需要加载css、js和媒体文件。没有签名url的文件

我只是不太确定如何实施这一点。

第一件事: AWS S3是一个键值存储,每个对象
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。请谨慎使用键开始,但这是有效的!