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

Azure需认证ZIP文件中XML读取的C#实现求助

C#读取Azure存储中带密码的ZIP包内XML文件解决方案

所需NuGet包

首先安装必要的依赖包:

  • Azure.Storage.Blobs:用于访问Azure Blob存储
  • SharpZipLib:处理带密码保护的ZIP文件(.NET原生System.IO.Compression不支持密码加密的ZIP)

核心实现代码

以下代码直接从Azure Blob存储读取ZIP文件到内存流,无需落地本地磁盘,然后解密ZIP并提取XML内容,最后调用你已有的数据库存储逻辑:

using Azure.Storage.Blobs;
using ICSharpCode.SharpZipLib.Zip;
using System.IO;
using System.Xml.Linq;
using System.Threading.Tasks;

// 配置参数
var storageConfig = new
{
    ConnectionString = "你的Azure存储连接字符串",
    ContainerName = "存储容器名称",
    ZipBlobPath = "目标ZIP文件的Blob路径(如:archives/encrypted_data.zip)",
    ZipPassword = "ZIP文件的密码"
};

// 读取Azure Blob中的ZIP并处理内部XML
async Task ProcessZipFromAzure()
{
    // 初始化Blob客户端
    var blobServiceClient = new BlobServiceClient(storageConfig.ConnectionString);
    var containerClient = blobServiceClient.GetBlobContainerClient(storageConfig.ContainerName);
    var zipBlobClient = containerClient.GetBlobClient(storageConfig.ZipBlobPath);

    // 将Blob内容读取到内存流
    using var zipMemoryStream = new MemoryStream();
    await zipBlobClient.DownloadToAsync(zipMemoryStream);
    zipMemoryStream.Position = 0; // 重置流指针到起始位置

    // 解密并遍历ZIP内文件
    using var zipInputStream = new ZipInputStream(zipMemoryStream);
    zipInputStream.Password = storageConfig.ZipPassword;
    ZipEntry zipEntry;

    while ((zipEntry = zipInputStream.GetNextEntry()) != null)
    {
        // 过滤非XML文件
        if (zipEntry.IsFile && zipEntry.Name.EndsWith(".xml", StringComparison.OrdinalIgnoreCase))
        {
            // 读取XML内容到内存流
            using var xmlStream = new MemoryStream();
            var buffer = new byte[4096];
            int bytesRead;
            while ((bytesRead = zipInputStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                xmlStream.Write(buffer, 0, bytesRead);
            }
            xmlStream.Position = 0;

            // 解析XML(替换为你自己的XML读取逻辑)
            var xmlDocument = XDocument.Load(xmlStream);

            // 调用你已实现的数据库存储方法
            SaveXmlToDatabase(xmlDocument);
        }
    }
}

// 你已有的数据库存储方法(示例)
void SaveXmlToDatabase(XDocument xmlData)
{
    // 这里写入你之前实现的将XML数据存入数据库的逻辑
}

关键注意事项

  • 权限验证:确保你的Azure存储连接字符串(或SAS令牌)拥有目标Blob的读取权限
  • 内存流优化:全程使用内存流避免磁盘IO,提升处理效率
  • 异常处理:建议添加try-catch块处理以下场景:
    • Azure存储连接失败、Blob不存在
    • ZIP密码错误、ZIP文件损坏
    • XML格式错误
  • 替代库选择:如果不想用SharpZipLib,也可以选择DotNetZip,但需注意其版本兼容性

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 16:20:20