C# mvc中动态压缩文件发送给前端
前言
帮朋友解决一个C#中发送压缩文件的的问题,因为感觉解释起来更麻烦,就直接用几分钟时间写了个小Demo。本着"走过路过"不错过的原则,也给记录一下.
1.前端代码
非常简单的一个a标签. 顺便提一句,此处用a标签,下载文件时,当前页面并不会跳转;
如果使用ajax异步下载文件的话,因为response的原因,一般请求浏览器是会处理服务器输出的 response,例如文件下载,json串返回等,ajax请求只是个“字符性”的请求,可以读取到返回的response,但也只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。
基于以上原因,ajax下载文件,会把文件内容当作文本信息读取,而不是执行下载. 应该可以通过配置方式解决,这里就不再细说了.
2.后端代码
a.版本1:文件下载(最简方式)
public ActionResult downZip() { var path = Server.MapPath("~/temp/123.zip"); var name = Path.GetFileName(path); return File(path, "application/zip", name); }
b.版本2:压缩目录public下为所有文件为一个压缩文件,保存到临时目录,返回给前端,并删除临时文件;
public ActionResult downZip() { ////1. //var path = Server.MapPath("~/temp/123.zip"); //var name = Path.GetFileName(path); //return File(path, "application/zip", name); //2. String fileName, zipName; byte[] bts; using (ZipFile zip = new ZipFile()) { zip.AddDirectory(Server.MapPath("~/public")); fileName = Server.MapPath("~/temp/simple.zip"); zipName = Path.GetFileName(fileName); zip.Save(fileName); bts = System.IO.File.ReadAllBytes(fileName); System.IO.File.Delete(fileName); } return File(bts, "application/zip", zipName); }
"public"是被压缩的目录,"temp"是存放临时zip文件的地方
3.后言
这种方式,有一个最大的弊端,就是文件较大时,内存占用过高.这个地方应该再优化下. 这周如果没时间,那就下周吧,我专门来再续个优化版(ps: 如果我还记得的话...嘿嘿)
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利;
本文出自:博客园--别问是谁