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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 04:13:10