SharpZipLib 库 ,实现 多文件压缩zip

博客包含前端代码和后端代码,还给出了相关知识链接,如header中Content - Disposition的作用、MIME http content - type以及C#获取文件名及扩展名的相关文章链接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前端代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <!--添加外部jQuery脚本-->
    <script src="http://code.jquery.com/jquery-3.1.1.min.js"></script>
</head>
<body>
    <!--普通固定url下载-->
    <a href="http://localhost:56657/api/Zip">本地测试下载</a>
    <br />
    <textarea id="fileUrl" placeholder="填写多个文件路径换行符分隔"></textarea>
    <br />
    <input id="getname" type="text" placeholder="填写生成的压缩名文件字" value="myzip.zip" />
    <!--根据表单参数生成url下载-->
    <a id="download" href="#">本地测试下载2</a>
    <br />
</body>
</html>

<script>
    $(function () {

        $("#download").click(function () {
            //根路径
            var baseUrl = "http://localhost:56657/api/Zip";
            var fileUrls = $("#fileUrl").val().split(/[(\r\n)\r\n]+/);
            var last = fileUrls.join(',');
            var getname = $("#getname").val();
            //拼接参数url
            baseUrl = baseUrl + "?ids=" + last + "&getname=" + getname;
            //打开新窗口下载
            window.open(baseUrl);
        });
    })
</script>

后端代码

using ICSharpCode.SharpZipLib.Zip;
using System;
using System.IO;
using System.Web;
using System.Web.Http;

namespace ZipTest.Controllers
{
    public class ZipController : ApiController
    {





        public void Get()
        {
            string ids = HttpContext.Current.Request.QueryString["ids"];
            string getname= HttpContext.Current.Request.QueryString["getname"];
            ZipParam body = new ZipParam()
            {
                files =  ids.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries),// new string[] { "D:\\1.txt", "D:\\2\\2.txt" },//
                zipFileName = getname//"myzip.zip" //"mytxt.txt"  
            };

            #region  原始
            //MemoryStream ms = new MemoryStream();
            //byte[] buffer = null;
            //using (ZipFile file = ZipFile.Create(ms))
            //{
            //    file.BeginUpdate();
            //    //file.NameTransform = new   MyNameTransfom();
            //    foreach (var item in body.files)
            //    {
            //        if (File.Exists(item))
            //        {
            //            file.Add(item);


            //        }
            //    }

            //    file.CommitUpdate();
            //    buffer = new byte[ms.Length];
            //    ms.Position = 0;
            //    ms.Read(buffer, 0, buffer.Length); //读取文件内容(1次读ms.Length/1024M) 
            //    ms.Flush();
            //    ms.Close();

            //}




            //HttpContext.Current.Response.Clear();
            //HttpContext.Current.Response.Buffer = true;
            //HttpContext.Current.Response.ContentType = "application/x-zip-compressed";
            //HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(body.zipFileName));
            //HttpContext.Current.Response.BinaryWrite(buffer);
            //HttpContext.Current.Response.Flush();
            //HttpContext.Current.Response.End();
            #endregion


            #region  新

            //基础输出流
            MemoryStream memoryStream = new MemoryStream();

            //使用压缩流
            using (ZipOutputStream zipOutputStream = new ZipOutputStream(memoryStream)) //HttpContext.Current.Response.OutputStream
            {
                foreach (var item in body.files)
                {
                    //文件流
                    FileStream fileStream = File.Open(item, FileMode.Open);
                    string fileName = fileStream.Name;

                    ZipEntry zipEntry = new ZipEntry(fileName);
                    zipEntry.DateTime = DateTime.Now;
                    zipOutputStream.PutNextEntry(zipEntry);

                    fileStream.CopyTo(zipOutputStream);
                    fileStream.Close();
                    zipOutputStream.Flush();

                }
                zipOutputStream.Finish();
                zipOutputStream.Close();
            }


            HttpContext.Current.Response.Clear();
            HttpContext.Current.Response.Buffer = true;
            HttpContext.Current.Response.ContentType = "application/octet-stream";// "text/plain";// "application /x-zip-compressed";     
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode(body.zipFileName));
            HttpContext.Current.Response.BinaryWrite(memoryStream.ToArray());//
            HttpContext.Current.Response.Flush();
            HttpContext.Current.Response.End();

            #endregion




        }



    }

    public class ZipParam
    {
        public string[] files { get; set; }
        public string zipFileName { get; set; }
    }






}

其他参见:

header中Content-Disposition的作用 https://mp.youkuaiyun.com/postedit/90411252

MIME http content-type https://mp.youkuaiyun.com/postedit/90409200

C# 获取文件名及扩展名 https://mp.youkuaiyun.com/postedit/90298912

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值