使用ZipArchive生成空ZIP文件 内存创建压缩包返回客户端无效如何排查
内存生成ZipArchive无效问题修复
存在的问题
- 错误使用StreamWriter处理二进制数据:StreamWriter是文本写入工具,传入byte数组时会调用其ToString方法,实际写入压缩条目的是
System.Byte[]字符串,而非你要存入的原始二进制文件内容。 - 内存流读取位置未重置:ZipArchive释放后,内存流的指针处于流的末尾,直接输出时不会读取到任何有效字节,导致生成空压缩包。
- Response输出方式错误:
Response.Write()不能直接接收MemoryStream对象,无法正确输出二进制内容。 - 潜在条目覆盖问题:如果循环中
str_filename变量值固定,每次创建的压缩条目同名,后写入的内容会覆盖之前的条目,最终压缩包内只剩最后一个文件。
修复后的代码
using (MemoryStream _memory_stream = new MemoryStream()) { using (ZipArchive _archive = new ZipArchive(_memory_stream, ZipArchiveMode.Create, true)) { // 此处添加文件序号变量避免同名条目,可根据实际业务替换为真实文件名生成逻辑 int fileIndex = 0; foreach (byte[] binaryData in this.FileBinaries) { fileIndex++; string str_filename = $"cert_{fileIndex}.dat"; ZipArchiveEntry _entry = _archive.CreateEntry(str_filename, CompressionLevel.Optimal); using (Stream _entryStream = _entry.Open()) { // 直接通过流写入二进制数据,移除文本处理类StreamWriter _entryStream.Write(binaryData, 0, binaryData.Length); } } } // 重置内存流读取位置到起始点 _memory_stream.Position = 0; Response.AppendHeader("content-disposition", "attachment; filename=certificates.zip"); Response.ContentType = "application/zip"; // 输出二进制流内容 Response.BinaryWrite(_memory_stream.ToArray()); Response.End(); }
内容的提问来源于stack exchange,提问作者Jakub Sluka
相关产品推荐
相关产品推荐

