从byte[]生成Zip文件后上传Blob存储无效,求代码排查
问题分析与修复:创建无效Zip文件的原因
你的代码存在一个关键错误:在ZipArchive的using块内部读取了MemoryStream的字节数组。
ZipArchive在Create模式下,并不会实时将所有Zip文件的结构信息写入底层流,它会在自身的using块结束(即释放资源)时,才会补充写入Zip文件必需的目录索引、结束标记等核心数据。你提前读取zipMemoryStream.ToArray()时,得到的只是Excel文件的原始字节,缺少Zip归档的关键结构,导致下载后的文件无法被识别为有效的Zip包。
修正后的代码
byte[] zipBytes; using (var zipMemoryStream = new MemoryStream()) { using (var archive = new ZipArchive(zipMemoryStream, ZipArchiveMode.Create, true)) { var zipExcelEntry = archive.CreateEntry( $"SAR-{subjectAccessRequest.Basic.FirstName}-{subjectAccessRequest.Basic.LastName}_{DateTime.Now:yyyyMMddHHmmss}.xlsx", CompressionLevel.Fastest); using (var excelEntryFile = zipExcelEntry.Open()) { excelEntryFile.Write(stream.ToArray(), 0, (int)stream.Length); } }; // 必须在ZipArchive释放后再读取流的内容 zipBytes = zipMemoryStream.ToArray(); }; return zipBytes;
额外注意事项
- 如果
stream是已经被读取过的流(Position属性不为0),stream.ToArray()依然能获取完整内容,但如果后续改用stream.CopyTo(excelEntryFile)的方式写入,需要先执行stream.Position = 0重置流的位置。
内容的提问来源于stack exchange,提问作者Liam Kenny
相关产品推荐
相关产品推荐

