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

如何用Azure Data Factory提取Blob存储中含子文件夹的Zip文件

解决Azure Data Factory提取含嵌套文件夹Zip文件的源解码错误问题

针对你遇到的ADF复制数据活动处理带子文件夹的Zip文件时出现的UserErrorFailedFileOperation源解码错误,以下是几种可行的解决方法:

方法一:调整复制数据活动的源配置

这是最直接的方案,通过修正ADF配置适配嵌套文件夹的Zip文件:

  • 源数据集设置:选择Blob存储数据集,将压缩类型设为ZipDeflate
  • 源活动配置:
    • 在「文件路径」设置中勾选递归选项,确保ADF能遍历Zip内的子文件夹
    • 文件名筛选指定目标Zip文件(如ExportPV.zip)
    • 切换到「复制行为」标签,将保留层级设为「全部」,确保解压后保留原有的子文件夹结构

方法二:用Azure Function辅助解压

如果方法一仍无法解决,可通过Azure Function实现自定义解压逻辑:

  1. 创建Blob触发的Azure Function(支持Python/C#),触发条件设为目标Blob容器中新增Zip文件
  2. 函数核心逻辑:下载Zip文件到临时目录→解压所有文件(含子文件夹)→将解压后的文件按原目录结构上传到指定输出Blob容器
  3. 示例Python代码片段:
import azure.functions as func
import zipfile
from azure.storage.blob import BlobServiceClient
import os
import tempfile

def main(myblob: func.InputStream):
    # 初始化Blob服务客户端
    blob_service_client = BlobServiceClient.from_connection_string(os.environ["AzureWebJobsStorage"])
    output_container = "your-output-container"
    output_container_client = blob_service_client.get_container_client(output_container)

    # 临时目录处理Zip文件
    with tempfile.TemporaryDirectory() as temp_dir:
        zip_file_name = os.path.basename(myblob.name)
        zip_local_path = os.path.join(temp_dir, zip_file_name)
        
        # 下载Zip到本地临时路径
        with open(zip_local_path, "wb") as f:
            f.write(myblob.read())
        
        # 解压所有文件
        with zipfile.ZipFile(zip_local_path, 'r') as zip_ref:
            zip_ref.extractall(temp_dir)
        
        # 遍历解压后的文件并上传,保留目录结构
        for root, _, files in os.walk(temp_dir):
            for file in files:
                if file == zip_file_name:
                    continue
                local_file_path = os.path.join(root, file)
                # 计算相对路径,保持原文件夹层级
                blob_path = os.path.relpath(local_file_path, temp_dir)
                blob_client = output_container_client.get_blob_client(blob_path)
                with open(local_file_path, "rb") as data:
                    blob_client.upload_blob(data, overwrite=True)
  1. 在ADF中添加「Azure Function活动」,调用该函数完成解压操作

方法三:使用Azure Logic Apps

无需编写代码,通过Logic Apps的内置动作实现解压:

  • 创建Logic App,触发方式选择「当Blob添加或修改时(属性仅)」,指向存储Zip文件的Blob容器
  • 添加「解压Zip文件」内置动作,选择源Zip文件和目标输出容器,勾选保留文件夹结构选项
  • 配置完成后,Logic App会自动监听并处理带嵌套文件夹的Zip文件

注意事项

  • 若处理大体积Zip文件,建议使用自托管集成运行时,避免托管运行时的资源限制
  • 确保ADF/Function/Logic App拥有Blob存储的读写权限
  • 提前验证Zip文件本身无损坏,部分解码错误可能由文件本身问题导致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 14:12:08