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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 15:24:06