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
相关产品推荐
相关产品推荐

