C# mvc中動態壓縮文件發送給前端

前言

  幫朋友解決一個C#中發送壓縮文件的的問題,由於感受解釋起來更麻煩,就直接用幾分鐘時間寫了個小Demo。本着"走過路過"不錯過的原則,也給記錄一下.前端

1.前端代碼

   

  很是簡單的一個a標籤. 順便提一句,此處用a標籤,下載文件時,當前頁面並不會跳轉;ajax

  若是使用ajax異步下載文件的話,由於response的緣由,通常請求瀏覽器是會處理服務器輸出的 response,例如文件下載,json串返回等,ajax請求只是個「字符性」的請求,能夠讀取到返回的response,但也只是讀取而已,是沒法執行的,說白點就是js沒法調用到瀏覽器的下載處理機制和程序。json

  基於以上緣由,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: 若是我還記得的話...嘿嘿)服務器

 

本文版權歸做者和博客園共有,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,不然保留追究法律責任的權利;app

本文出自:博客園--別問是誰異步

相關文章
相關標籤/搜索