C#文件打包下载

using ICSharpCode.SharpZipLib.Zip;
using Qianchen.Application.Base.SystemModule;
using Qianchen.Application.OA.File.FilePreview;
using Qianchen.Util;
using System.Collections.Generic;
using System.IO;
using System.Web;
using System.Web.Mvc;

namespace Qianchen.Application.Web.Areas.LR_SystemModule.Controllers
{
    /// <summary>
    /// 版 本 v7.0.6 开发框架
    /// Copyright (c) 2013-2020 QC
    /// 创建人:框架开发组
    /// 日 期:2017.03.08
    /// 描 述:附件管理
    /// </summary>
    public class AnnexesController : MvcControllerBase
    {
       // 省略部分代码

        /// <summary>
        /// 下载文件
        /// </summary>
        /// <param name="idsJson">文件id</param>
        /// <returns></returns>
        [HttpPost]
        [ValidateAntiForgeryToken]
        public void DownAnnexesFileZip(string id)
        {
            List<FileEntity> fileList = new List<FileEntity>();
            IEnumerable<AnnexesFileEntity> list = annexesFileIBLL.GetList(id);
            //int count = 0;
            Dictionary<string, int> dict = new Dictionary<string, int>();
            foreach (var entity in list)
            {
                if (System.IO.File.Exists(entity.F_FilePath))
                {
                    int count = 0;
                    if (dict.ContainsKey(entity.F_FileName))

                    {

                        if (dict.TryGetValue(entity.F_FileName, out count))

                        {

                            count++;
                            dict.Remove(entity.F_FileName);
                            dict.Add(entity.F_FileName, count);

                            // 处理重名文件,避免打包失败

                            entity.F_FileName = "(" + count + ")" + entity.F_FileName;

                        }

                    }

                    else

                    {

                        dict.Add(entity.F_FileName, 0);

                    }
                    fileList.Add(new FileEntity(entity.F_FileName, entity.F_FilePath));
                }
            }

            DownLoadoldAll(fileList);
        }


        #endregion
        #region 私有方法

        /// <summary>
        /// 打包下载
        /// </summary>
        /// <param name="FileName">文件虚拟路径</param>
        ///  /// <param name="name">返回客户端名称</param>
        private  void DownLoadoldAll(List<FileEntity> fileList)
        {
            Dictionary<string, Stream> streams = new Dictionary<string, Stream>();
            Stream streamWriter = null;
            foreach (var entity in fileList)
            {
                //将所有文件流在循环中加进,根据自己情况来写
                streamWriter = System.IO.File.Open(entity.FilePath, FileMode.Open);
                streams.Add(entity.FileName, streamWriter);
            }

            //下面可以直接复制粘贴
            MemoryStream ms = new MemoryStream();
            ms = PackageManyZip(streams);
            byte[] bytes = new byte[(int)ms.Length];
            ms.Read(bytes, 0, bytes.Length);
            ms.Close();
            Response.ContentType = "application/octet-stream";
            //通知浏览器下载文件而不是打开
            Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode("打包文档.zip", System.Text.Encoding.UTF8));
            Response.BinaryWrite(bytes);
            Response.Flush();
        }

        /// <summary>
        /// 将多个流进行zip压缩,返回压缩后的流
        /// </summary>
        /// <param name="streams">key:文件名;value:文件名对应的要压缩的流</param>
        /// <returns>压缩后的流</returns>
        private static MemoryStream PackageManyZip(Dictionary<string, Stream> streams)
        {
            byte[] buffer = new byte[6500];
            MemoryStream returnStream = new MemoryStream();
            var zipMs = new MemoryStream();
            using (ZipOutputStream zipStream = new ZipOutputStream(zipMs))
            {
                zipStream.SetLevel(9);
                foreach (var kv in streams)
                {
                    string fileName = kv.Key;
                    using (var streamInput = kv.Value)
                    {
                        zipStream.PutNextEntry(new ZipEntry(fileName));
                        while (true)
                        {
                            var readCount = streamInput.Read(buffer, 0, buffer.Length);
                            if (readCount > 0)
                            {
                                zipStream.Write(buffer, 0, readCount);
                            }
                            else
                            {
                                break;
                            }
                        }
                        zipStream.Flush();
                    }
                }
                zipStream.Finish();
                zipMs.Position = 0;
                zipMs.CopyTo(returnStream, 5600);
            }
            returnStream.Position = 0;
            return returnStream;
        }

        #endregion
    }

    public class FileEntity
    {
        public FileEntity() { }
        public FileEntity(string FileName, string FilePath)
        {
            this.FileName = FileName;
            this.FilePath = FilePath;
        }
        /// <summary>
        /// 文件名称
        /// </summary>
        /// <returns></returns>
        public string FileName { get; set; }
        /// <summary>
        /// 文件路径
        /// </summary>
        /// <returns></returns>
        public string FilePath { get; set; }
    }
}

  

posted @ 2021-09-16 15:23  居无常  阅读(252)  评论(0编辑  收藏  举报