S3 / Cloudfront:如何在存储桶中列出文件夹的内容

好的

我编写了一种方法,该方法对URL进行签名以读取可通过Cloudfront访问的S3存储桶:

private HTTPResponse signURL(String endpoint) {
    String keyPairId = 'keyPairId';
    String secret    = 'SOME_SECRET';
    String method    = 'GET';
    Datetime dt      = Datetime.now();
    Long l           = dt.getTime();
    Long expiryLong  = (l / 1000) + 3600;
    String expiry    = String.valueOf(expiryLong);
    String policy    = policy('http://' + cfhost + '/' + endpoint, expiry);
    String policyEnc = EncodingUtil.base64Encode(Blob.valueOf(policy));
    String rPolicy   = cfReplace(policyEnc);
    Blob mac         = Crypto.generateMac('HMACSHA1',
                                          Blob.valueOf(rPolicy),
                                          Blob.valueOf(secret));
    String signature = cfReplace(EncodingUtil.base64Encode(mac));

    HttpRequest req = new HttpRequest();
    req.setMethod(method);
    req.setEndpoint('http://' + cfhost + '/' + endpoint + '?Policy=' +
        policyEnc + '&Signature=' + signature + '&Key-Pair-Id=' +
        keyPairId);

    Http http = new Http();
    HTTPResponse res = http.send(req);
    return res;
}

现在,如果将端点设置为,则我的方法可以正常工作''如果将文件夹名称放在端点中(如00Q17000008LRcAEAW/*),那么XML响应中会出现很多错误。

XMLNode[ELEMENT,Error,null,null,null,[XMLNode[ELEMENT,Code,null,null,null,[XMLNode[TEXT,null,null,null,null,null,NoSuchKey,]],null,], XMLNode[ELEMENT,Message,null,null,null,[XMLNode[TEXT,null,null,null,null,null,The specified key does not exist.,]],null,], XMLNode[ELEMENT,Key,null,null,null,[XMLNode[TEXT,null,null,null,null,null,00Q17000008LRcAEAW/*,]],null,], XMLNode[ELEMENT,RequestId,null,null,null,[XMLNode[TEXT,null,null,null,null,null,some_req_id,]],null,], XMLNode[ELEMENT,HostId,null,null,null,[XMLNode[TEXT,null,null,null,null,null,some_host_id,]],null,]],null,]

我无法列出整个存储桶,因为它对于1000键的限制来说太大了。如何列出文件夹?

迈克尔-SQLbot

有关S3的期望,请参阅S3文档中的“列表对象,V1V2 ”。

简而言之,您必须/在查询字符串中而不是路径中提供前缀和分隔符(几乎总是)。对于对象列表,路径始终是存储桶的根,例如:

https://dxxxexample.cloudfront.net/?delimiter=/&prefix=00Q17000008LRcAEAW/&...

这也意味着,如果您为分发定义默认的根对象,则也无法通过分发拉目录列表。在这种情况下,您需要第二个发行版,或者您需要直接从S3获取对象列表。

无论如何,请记住,对象列表相对昂贵,是GET请求价格的10倍以上,因此,如果缓存响应是有意义的,则使用CloudFront来获取它们可能是有意义的,或者您可能想要做完全不同的事情,例如对象列表。我一直在使用S3事件通知,Lambda和RDS进行设置,以将所有对象及其元数据存储在单独的近实时数据库中,在此数据库中我可以获得更快,更完整的清单,而无需付出任何代价(并且我可以根据对象的元数据搜索对象)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在AWS S3存储桶的特定“文件夹”中列出文件

从多个文件夹的s3存储桶中仅读取特定的json文件

从boto3检索S3存储桶中的子文件夹名称

仅列出s3存储桶中的子文件夹

如何使用Terraform在Amazon S3存储桶中创建文件夹

将文件放在S3存储桶的文件夹中

亚马逊s3,将文件上传到存储桶中的文件夹中

Amazon S3:如何获取存储桶中的文件夹列表?

使用API在Amazon S3存储桶中创建文件夹/上传文件

PowerShell for AWS:仅列出S3存储桶中的“文件夹”吗?

如何从Amazon S3存储桶中的文件夹中获取所有文件?

从S3存储桶中的文件夹中删除文件

如何在S3存储桶中查找文件夹的大小?

Amazon S3存储:可以在私有存储桶中列出公共文件夹吗?

复制S3存储桶中嵌套文件夹中的文件

Amazon S3如何在“文件夹”中列出文件

如何从S3存储桶中的文件夹中删除带后缀的图像

AWS S3存储桶策略-仅允许文件夹中的某些文件类型

仅从s3存储桶文件夹中获取文件名

Presto:如何从s3中读取在子文件夹中分区的整个存储桶?

删除位于Amazon S3上存储桶中的子文件夹中的文件

如何在GDrive v3的快捷方式文件夹中列出文件

如何在使用Cloudfront上传的S3存储桶中获取文件?

Mule ESB:如何获取所有存储在Amazon S3存储桶内的文件夹中的文件(获取对象内容)

如何在Amazon S3存储桶中创建新文件夹?

如何在不公开对象文件夹的情况下访问 S3 存储桶中的对象

如何从 s3 存储桶中删除空的子文件夹?

如何检查 Amazon S3 存储桶中的文件夹是否为空?- boto3 蟒蛇

如何在 S3KeySensorOperator Airflow 中提供 s3 存储桶目录的文件夹路径