C#打包下载功能文件流方式

1、html页面

    //下载文件
    function btn_downfile() {
        var rows = $("#gridTable").datagrid('getChecked');
        if (rows.length == 0) {
            dialogMsg("请勾选一条数据!", -1);
            return false;
        }
        var ids = "";
        for (var i = 0; i < rows.length; i++) {
            ids += rows[i]["ID"]+",";
        }
        ids = ids.substr(0, ids.length - 1);
        location.href = "/SSWeb/Product/DownPackageFile?ID=" + ids;
        
    }

2、控制器类

首先需要引用using ICSharpCode.SharpZipLib.Zip;

        /// <summary>
        /// 打包下载
        /// </summary>
        /// <param name="ID">ID</param>
        /// <returns></returns>
        [HttpGet]
        public ActionResult DownPackageFile(string ID)
        {
            if (string.IsNullOrEmpty(ID))
            {
                return Error("请勾选数据!");
            }

            Dictionary<string, MemoryStream> dc = new Dictionary<string, MemoryStream>();
            ProductBiz biz = new ProductBiz();
            var docList = biz.GetListEntity(ID);
            if (docList.Count > 0)
            {
                dc = GetFileFromNetUrl(docList);
            }
            //zip 文件名称
            var zipFileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".zip";
            MemoryStream ms = new MemoryStream();
            byte[] buffer;
            using (ZipFile file = ZipFile.Create(ms))
            {
                file.BeginUpdate();
                foreach (var item in dc)
                {
                    StreamDataSource sd = new StreamDataSource(item.Value);
                    file.Add(sd, item.Key);
                }
                file.CommitUpdate();
                buffer = new byte[ms.Length];
                ms.Position = 0;
                ms.Read(buffer, 0, buffer.Length);

            }
            return File(ms.ToArray(), "application/zip", zipFileName);
        }
        /// <summary>
        /// 下载文件转为文件流
        /// </summary>
        /// <param name="list"></param>
        private Dictionary<string, MemoryStream> GetFileFromNetUrl(List<ProductEntity> list)
        {
            try
            {
                Dictionary<string, MemoryStream> dc = new Dictionary<string, MemoryStream>();
                foreach (var item in list)
                {
                    string filename = item.Title;
                    WebRequest req = WebRequest.Create(item.Url);
                    req.Method = "GET";
                    //读取到内存
                    MemoryStream stmMemory = new MemoryStream();
                    using (WebResponse webRes = req.GetResponse())
                    {
                        int length = (int)webRes.ContentLength;
                        HttpWebResponse response = webRes as HttpWebResponse;
                        Stream stream = response.GetResponseStream();
                        byte[] buffer = new byte[length];
                        int i;
                        //将字节逐个放入到Byte中
                        while ((i = stream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            stmMemory.Write(buffer, 0, i);
                        }
                    }
                    dc.Add(filename, stmMemory);
                }
                return dc;
            }
            catch (System.Exception ex)
            {
                throw ex;
            }
        }

3、帮助类

    /// <summary>
    /// 把文件流转为字节数组
    /// </summary>
    public class StreamDataSource : IStaticDataSource
    {
        /// <summary>
        /// 
        /// </summary>
        public byte[] bytes { get; set; }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="ms"></param>
        public StreamDataSource(MemoryStream ms)
        {
            bytes = ms.GetBuffer();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public Stream GetSource()
        {
            Stream s = new MemoryStream(bytes);
            return s;
        }
    }

批量打包下载文件,新版地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值