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

如何使用Node.js SDK下载AWS S3存储桶子文件夹中的文件?

使用Node.js SDK下载S3存储桶“子文件夹”内的文件

首先明确:S3本身没有真实的文件夹结构,所谓的“子文件夹”是通过对象Key中的前缀(比如your-subfolder/)来模拟的。下面是具体实现步骤:

1. 安装依赖

如果你用AWS SDK v3(推荐),安装以下包:

npm install @aws-sdk/client-s3 @aws-sdk/lib-storage fs-extra

fs-extra用于更方便地创建本地目录,@aws-sdk/lib-storage用于大文件的分段下载(可选,小文件直接用GetObjectCommand即可)

2. 配置S3客户端

先初始化S3客户端,填入你的AWS凭证和区域:

const { S3Client, ListObjectsV2Command, GetObjectCommand } = require("@aws-sdk/client-s3");
const { Download } = require("@aws-sdk/lib-storage");
const fs = require('fs-extra');
const path = require('path');

const s3Client = new S3Client({
  region: 'your-region', // 例如us-east-1
  credentials: {
    accessKeyId: 'your-access-key',
    secretAccessKey: 'your-secret-key'
  }
});

3. 列出指定前缀下的所有对象

用ListObjectsV2Command获取所有Key包含目标前缀的对象,注意排除前缀本身(如果它被当作空对象存在):

async function listObjectsInPrefix(bucketName, prefix) {
  const params = {
    Bucket: bucketName,
    Prefix: prefix,
    Delimiter: '' // 不使用分隔符,返回所有前缀下的对象
  };

  let allObjects = [];
  let continuationToken;

  do {
    if (continuationToken) {
      params.ContinuationToken = continuationToken;
    }

    const command = new ListObjectsV2Command(params);
    const response = await s3Client.send(command);
    
    // 过滤掉前缀本身(空对象)
    const objects = response.Contents?.filter(obj => obj.Key !== prefix) || [];
    allObjects.push(...objects);
    
    continuationToken = response.NextContinuationToken;
  } while (continuationToken);

  return allObjects;
}

4. 遍历对象并下载到本地

遍历获取到的对象,根据Key中的路径创建本地目录,然后分情况下载文件:

async function downloadFolder(bucketName, prefix, localDir) {
  const objects = await listObjectsInPrefix(bucketName, prefix);

  for (const obj of objects) {
    // 去掉前缀,得到本地相对路径
    const relativePath = obj.Key.replace(prefix, '');
    const localFilePath = path.join(localDir, relativePath);
    
    // 自动创建文件所在的目录
    await fs.ensureDir(path.dirname(localFilePath));

    // 10MB以下小文件用普通下载
    if (obj.Size < 10 * 1024 * 1024) {
      const command = new GetObjectCommand({
        Bucket: bucketName,
        Key: obj.Key
      });
      const response = await s3Client.send(command);
      await fs.writeFile(localFilePath, response.Body);
    } else {
      // 大文件用分段下载,支持断点续传
      const download = new Download({
        client: s3Client,
        params: {
          Bucket: bucketName,
          Key: obj.Key
        }
      });

      await download.download(localFilePath);
    }

    console.log(`已下载: ${obj.Key} -> ${localFilePath}`);
  }

  console.log('下载完成');
}

// 调用示例
downloadFolder('your-bucket-name', 'your-subfolder/', './local-download-path');

注意事项

  • 确保你的AWS凭证拥有s3:ListBucket和s3:GetObject权限
  • 前缀末尾记得加/,避免匹配到类似subfolderXYZ的无关Key
  • 可以根据需求调整小文件的阈值(示例中是10MB)
  • 如果存储桶开启了版本控制,需额外处理版本ID参数

内容的提问来源于stack exchange,提问作者CodeFarmer_EC

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 22:48:29