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: 如果我还记得的话...嘿嘿)

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利;

本文出自:博客园--别问是谁

原文地址:https://www.cnblogs.com/Andrew-XinFei/p/6233978.html