我是AWS新手。我正在使用NodeJS创建一个Scheduled lambda函数。在那里,我需要获取文件夹中的所有对象并遍历每个对象,以检查上次修改日期,并且我想删除旧对象。但我在ListObject的响应内容中得到空数组。
var s3 = new aws.S3();
exports.handler = (event, context, callback) => {
var params = {
Bucket: 'bucket_name',
Delimiter: '/',
Prefix: 'folder_name',
MaxKeys:100000
};
s3.listObjects(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else
{
var folderLength = data.Contents.length;
data.Contents.forEach(function(metadata) {
console.log('Key: ' + metadata.Key);
});
}
});
callback(null, 'Finished');
};
但在回复中我得到Contents: []
。谁能告诉我什么是错的?
答案 0 :(得分:1)
当您使用Delimiter: '/'
致电ListObjects()
时,data
内有两个感兴趣的数组:Contents
和CommonPrefixes
。
Contents
是以您指定的Prefix
值开头的对象列表,但不包括下一个Delimiter
,CommonPrefixes
是常用前缀的列表对所有前缀为Prefix
的对象,包括下一次出现的Delimiter
(按惯例为/
)。
S3实际上没有文件夹 - 只是共享公共前缀的对象,用/
分隔。
在S3控制台中创建文件夹foo
时,实际创建了一个键为foo/
的空对象。但是,如果使用API上传带有键foo/bar.html
的对象,则为了方便起见,控制台仍会在名为bar.html
的文件夹中将其显示为文件foo
,即使在后一种情况下,没有显式创建foo/
个对象。值得注意的是,在任何情况下,对象实际上都不是"在"一个有意义的"文件夹"容器。它只是以这种方式呈现的。 S3没有实际的文件夹 - 只有对象和存储桶。
如果你想要一个文件夹中的所有对象""你真正要说的是你希望这些对象共享一个共同的密钥前缀。
但是当S3提供共享公共密钥前缀" folder_name"的所有对象的列表时直到下一个/
(如上所述),然后就没有了。
在原始代码中,Contents
为空,但您会发现响应中的data.CommonPrefixes
包含单个值folder_name/
,因为所有以键开头的对象folder_name
直到下一个/
实际上共享公共前缀folder_name/
。
在提出两个请求时没有意义,第一个请求是冗余且不必要的(事实上,如果多个文件夹的名称以>开头,那么这样做会给你不正确的结果" folder_name")所以当你想要一个对象列表"在一个文件夹中,"正确的方法是将Prefix
设置为folder_name + '/'
。