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

从Azure Storage Blob读取Zip文件时触发InvalidDataException的解决咨询

问题诊断与解决

错误原因

你代码里的核心问题是将二进制Zip文件错误地以UTF8字符串格式处理。Zip是二进制文件,直接把它的内容转成string再通过Encoding.UTF8.GetBytes()转回字节流,会破坏原始的二进制数据结构——UTF8编码无法正确还原所有二进制字节,导致ZipArchive读取时无法识别合法的归档结构,从而抛出InvalidDataException。

修复方案

直接操作二进制流,避免字符串转换步骤。有两种可靠的实现方式:

方式1:直接使用下载返回的Stream

using System;
using System.IO.Compression;
using Azure.Storage.Blobs;

class Program
{
    async static Task Main(string[] args)
    {
        string blobContainerName = "test-container-001";
        string blobName = "input/report.zip";

        var containerClient = new BlobContainerClient("UseDevelopmentStorage=true", blobContainerName);
        var blobClient = containerClient.GetBlobClient(blobName);

        var content = await blobClient.DownloadContentAsync();
        // 直接获取原始二进制流,无需字符串转换
        using (var stream = content.Value.Content.ToStream())
        using (var zipArchive = new ZipArchive(stream, ZipArchiveMode.Read))
        {
            foreach(var e in zipArchive.Entries)
            {
                Console.WriteLine(e.Name);
                // 在这里处理归档内的文件
            }
        }
    }
}

方式2:下载到MemoryStream(适合需要复用流的场景)

using System;
using System.IO;
using System.IO.Compression;
using Azure.Storage.Blobs;

class Program
{
    async static Task Main(string[] args)
    {
        string blobContainerName = "test-container-001";
        string blobName = "input/report.zip";

        var containerClient = new BlobContainerClient("UseDevelopmentStorage=true", blobContainerName);
        var blobClient = containerClient.GetBlobClient(blobName);

        using var memoryStream = new MemoryStream();
        // 直接将Blob内容下载到MemoryStream
        await blobClient.DownloadToAsync(memoryStream);
        // 重置流的位置到开头,否则ZipArchive会从流末尾开始读取
        memoryStream.Position = 0;

        using (var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Read))
        {
            foreach(var e in zipArchive.Entries)
            {
                Console.WriteLine(e.Name);
                // 在这里处理归档内的文件
            }
        }
    }
}

关键注意点

  • 永远不要用字符串编码处理二进制文件(如Zip、图片、视频等),只有纯文本文件适合用字符串转换。
  • 使用MemoryStream时,下载完成后必须重置Position为0,否则后续读取操作会从流的末尾开始,导致读取到空内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 12:41:02