我想做一个简单的任务:列出特定"文件夹"中的所有对象在s3中。文件夹的结构是这样的
s3Bucket/folder1/folder2/some-txt-file.txt.
在我的情况下,我需要列出文件夹2中的所有内容。我想让node给出这样的输出
['some-txt-file.txt']
我正在为此编写一个函数。我使用for循环是因为我在文件夹2中有多个文件,所以输出应该是文本文件名的列表。代码如下所示
const AWS = require('aws-sdk');
const s3Bucket = process.env.S3_BUCKET;
AWS.config.loadFromPath('./config_test.json');
const s3 = new AWS.S3();
async function list_everything_in_folder2(f1,f2){
var params = {
Bucket:s3Bucket,
Delimiter:'/',
Prefix:f1+'/'+f2+'/'
}
const objs = await s3.listObjectsV2(params).promise();
var out=[];
for(obj of objs.CommonPrefixes){
out.push(obj.Prefix);
}
return out
}
结果为空列表。
有趣的是,当我忽略函数的第二个参数并将我的Prefix放在像这样的参数中时
var params = {
Bucket: 'top-bucket',
Delimiter: '/',
Prefix: f1 +'/'
}
输出成为
['top-bucket/folder1/']
我似乎无法浏览更多的嵌套文件夹,可以说,在"第一次出现分隔符"之后,它就停止工作了。什么好主意吗?我在这里和其他地方寻找答案,但根据他们,我没有做错什么?顺便说一句,我对nodejs很陌生,所以给我解释一下,就像我5岁一样。由于
CommonPrefixes
包含指定分隔符之间的对象中重复前缀的列表。换句话说,它是"子目录"的列表。查看当前列表。
对象列表在Contents
中,因此将for循环更改为:
for(obj of objs.Contents){
out.push(obj.Key);
}
这将输出该前缀下的对象,不包括任何更深一层的对象。如果需要从指定的前缀开始的完整递归清单,请从params
中删除Delimiter:'/',
。