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

