如何使用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
相关产品推荐
相关产品推荐

