You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:24:03