Node.js使用listObjectsV2获取S3嵌套子文件夹内对象失败如何解决
问题根因
你代码出现空返回的核心原因是混淆了listObjectsV2接口返回的两个字段的用途:
CommonPrefixes:仅存储当前前缀下的子文件夹路径,你要查询的folder2下没有子文件夹,所以这个字段是空数组Contents:才是存储当前前缀下所有文件对象的字段,你需要的文件名就在这个字段的返回结果里
另外S3本身没有真实的文件夹结构,所有对象都是扁平化存储的,路径中的/只是对象Key的普通字符,接口是通过Prefix和Delimiter参数模拟出文件夹层级的效果。
修正后的代码
你只需要把遍历逻辑改成从Contents字段取值,再把前缀去掉,只保留最后的文件名即可:
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){ const prefix = `${f1}/${f2}/`; var params = { Bucket: s3Bucket, Delimiter: '/', Prefix: prefix } const objs = await s3.listObjectsV2(params).promise(); var out = []; // 遍历Contents字段取文件 for (const obj of objs.Contents) { // 去掉前缀,只保留最后的文件名 const fileName = obj.Key.replace(prefix, ''); // 过滤掉空的文件夹占位对象(如果存在的话) if (fileName) { out.push(fileName); } } return out; }
补充说明
如果folder2下的文件数量超过1000个,S3默认只会返回前1000条结果,你需要判断返回结果里的IsTruncated字段为true时,用NextContinuationToken循环请求剩下的内容,才能拿到完整的文件列表。
内容的提问来源于stack exchange,提问作者skippynk
相关产品推荐
相关产品推荐

