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

DotNetZip报Bad state异常:NET MVC4多字节数组打包Zip问题

解决DotNetZip打包字节数组时的"Bad state (invalid literal/length code)"异常

嘿,我一眼就瞅出你代码里的几个问题,这正是触发异常的根源:

问题出在哪?

  • 提前调用了Save方法:你在foreach循环内部就执行了archive.Save("All.zip"),这会直接完成Zip文件的写入并关闭归档,后续再操作entry.OpenReader()肯定会报错——归档已经处于不可操作的状态了。
  • 错误地使用OpenReader写入数据:AddEntry方法本身就支持直接传入字节数组创建条目,你完全不需要再打开读取流去写入内容,这逻辑完全搞反了,OpenReader是用来读取已存在的Zip条目内容的,不是用来写入的。

修正后的代码示例

下面是调整后的正确写法,适配ASP.NET MVC 4的场景,最终返回一个可供前端下载的FileResult:

public ActionResult DownloadAllFilesAsZip()
{
    // 替换成你的字节数组列表
    List<byte[]> byteArrays = GetYourFileByteArrays();
    int fileIndex = 0;

    using (MemoryStream ms = new MemoryStream())
    {
        using (var archive = new ZipFile())
        {
            foreach (var fileBytes in byteArrays)
            {
                // 直接用AddEntry传入字节数组创建PDF条目
                archive.AddEntry($"file{fileIndex}.pdf", fileBytes);
                fileIndex++;
            }
            // 所有条目添加完成后,再统一保存到MemoryStream
            archive.Save(ms);
        }
        // 重置流的位置到开头,确保能正确读取内容
        ms.Position = 0;
        // 返回Zip文件供下载,指定文件名和MIME类型
        return File(ms, "application/zip", "All.zip");
    }
}

补充注意点

  • 确保你已经通过NuGet正确安装了DotNetZip包(执行Install-Package DotNetZip)
  • 绝对不要在循环内调用Save方法,必须等所有条目都添加完毕后再执行保存操作
  • 最后一定要重置MemoryStream的Position到0,否则前端下载的文件会是空的

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:08:02