Azure Storage listBlobsFlat/listBlobsByHierarchy返回空的问题求助
解决Azure Blob存储文件列表为空并迁移至AWS S3的方案
问题定位
Azure Blob存储里的nfe和cte是虚拟文件夹(并非实际物理目录),如果listBlobsByHierarchy调用参数配置错误,就会返回空结果。最常见的问题是分隔符设置不对,或者前缀未正确匹配虚拟文件夹格式。
正确的文件列表与迁移实现代码
以下是完整的迁移脚本示例,基于Azure Storage SDK v12和AWS SDK v3实现:
1. 依赖安装
npm install @azure/storage-blob @aws-sdk/client-s3 @aws-sdk/lib-storage
2. 完整迁移代码
const { BlobServiceClient } = require("@azure/storage-blob"); const { S3Client } = require("@aws-sdk/client-s3"); const { Upload } = require("@aws-sdk/lib-storage"); // Azure存储配置 const AZURE_CONN_STR = "你的Azure存储连接字符串"; const AZURE_CONTAINER = "roboprod"; const TARGET_PREFIXES = ["nfe/", "cte/"]; // 前缀必须带斜杠,匹配虚拟文件夹格式 // AWS S3配置 const AWS_REGION = "你的AWS区域"; const AWS_S3_BUCKET = "你的S3桶名称"; const s3Client = new S3Client({ region: AWS_REGION }); async function migrateBlobPrefix(prefix) { // 初始化Azure Blob客户端 const blobServiceClient = BlobServiceClient.fromConnectionString(AZURE_CONN_STR); const containerClient = blobServiceClient.getContainerClient(AZURE_CONTAINER); // 递归列出指定前缀下的所有文件Blob const blobHierarchy = containerClient.listBlobsByHierarchy("/", { prefix }); for await (const item of blobHierarchy) { if (!item.isPrefix) { // 跳过虚拟文件夹,只处理实际文件 const blobClient = containerClient.getBlobClient(item.name); try { // 下载Azure Blob流 const downloadRes = await blobClient.download(); // 上传至S3,保留原文件路径(可按需修改S3键名) const uploadTask = new Upload({ client: s3Client, params: { Bucket: AWS_S3_BUCKET, Key: item.name, Body: downloadRes.readableStreamBody } }); await uploadTask.done(); console.log(`已迁移:${item.name}`); } catch (err) { console.error(`迁移失败 ${item.name}:${err.message}`); } } } } // 批量执行所有文件夹迁移 async function startMigration() { for (const prefix of TARGET_PREFIXES) { console.log(`开始迁移前缀:${prefix}`); await migrateBlobPrefix(prefix); } console.log("全部迁移完成"); } startMigration().catch(err => console.error("全局迁移错误:", err));
关键注意事项
- 前缀格式必须正确:虚拟文件夹的前缀必须以
/结尾(比如nfe/),否则会匹配到类似nfe123.xml这类不符合预期的文件。 - 过滤虚拟文件夹:
listBlobsByHierarchy返回的结果中,isPrefix为true的是虚拟文件夹条目,需要跳过只处理实际Blob文件。 - 权限验证:确保Azure存储连接字符串拥有
Blob Data Reader和Blob Data Contributor权限;AWS凭证拥有s3:PutObject权限。 - 流处理优化:直接使用流进行下载和上传,避免将大文件加载到内存,提升迁移效率与稳定性。
内容的提问来源于stack exchange,提问作者Rodrigo Alves
相关产品推荐
相关产品推荐

