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

Lambda环境下.NET Core 6 C#读取S3 Zip文件遇ZipArchive异常

解决AWS Lambda中C# .NET Core 6使用ZipArchive解压S3文件时的异常问题

异常原因分析

“End of Central Directory record could not be found.”异常通常由以下情况导致:

  • 读取的流不包含完整有效的ZIP文件结构
  • S3返回的响应流未被完整加载,直接用于ZipArchive解析时数据不完整
  • 目标S3对象本身不是标准ZIP格式(比如误命名为.zip的其他压缩文件,或上传过程中文件损坏)

解决方案

1. 验证S3文件有效性

手动下载S3存储桶中的目标文件,使用本地解压工具(如WinRAR、7-Zip)尝试解压,确认文件本身是完整且标准的ZIP格式。如果本地解压失败,说明文件上传时已损坏,需重新上传正确的ZIP文件。

2. 将S3响应流缓存到MemoryStream后再解析

S3的ResponseStream是未本地缓存的网络流,而ZipArchive需要读取完整的文件结构才能解析。需先将流复制到MemoryStream,重置流位置后再创建ZipArchive:

using var objResult = await _s3Client.GetObjectAsync(bucket, key);
using var memoryStream = new MemoryStream();
// 将S3响应流完整复制到内存流
await objResult.ResponseStream.CopyToAsync(memoryStream);
// 重置内存流位置到起始点,确保ZipArchive可完整读取
memoryStream.Position = 0;

using var zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Read);

foreach (ZipArchiveEntry zipEntry in zipArchive.Entries)
{
    using var entryStream = zipEntry.Open();
    using var output = new MemoryStream();
    await entryStream.CopyToAsync(output);
    output.Position = 0;

    // 此处添加读取output流的业务代码
}

3. 额外检查项

  • 确认Lambda函数的内存配置足够处理目标ZIP文件,避免因内存不足导致流复制不完整
  • 为GetObjectAsync添加异常捕获逻辑,确认未出现部分下载或权限问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 06:48:27