标签:
需求来源:有大量存放于服务器上的文件,出于安全考虑文件名随机,但客户来下载时需要转化为有意义的名字并能够打包下载。
dll下载地址:http://icsharpcode.github.io/SharpZipLib/
本文中主要使用了ICSharpCode.SharpZipLib.Zip中的ZipFile和INameTransform。ZipFile用来生成压缩文件;INameTransform用来把格式化无序的文件名,需要注意的是其中的TransformFile接口方法会被调用两次。
public partial class XZZS_Pae : MyPage //继承于自己封装的Page类 { protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { if (RequestString("sfys").Equals("1"))//根据传入的参数判断是不是批量压缩下载 { GetZipFile(); } else { //单个文件下载,不再列出 } } } #endregion Page_Load 页面加载 /// <summary> /// 把文件进行压缩打包 /// </summary> public void GetZipFile() { //获取传递进来的文件ID的列表 string[] sid = this.RequestString("zs_id").Split(‘,‘); if (sid.Length < 1) return; MemoryStream ms = new MemoryStream(); byte[] buffer = null; using (ZipFile zfile = ZipFile.Create(ms)) { zfile.BeginUpdate(); //通过下面的名称格式化器,可以将里面的文件名进行一些处理。 //默认情况下,会自动根据文件的路径在zip中创建有关的文件夹。注意,是全路径。 zfile.NameTransform = new MyNameTransfom(this.Opusr.UnitID.ToString()); for (int izs = 0; izs < sid.Length; izs++) { //根据文件ID从数据库中查询实体路径的SqlTy为本人封装的类,可以根据需要自己编写取得dt的代码 DataTable dt = SqlTy.ExecuteDatatable("select zs_lj from zs where zs_id=‘" + sid[izs] + "‘"); if (dt.Rows.Count < 1) continue; //根据数据库中查询到的信息获取相对应文件的实际路径 string sfile = ConfigurationSettings.AppSettings["PDFFilePath"] + dt.Rows[0]["zs_lj"].ToString() + sid[izs] + ".pdf"; if (!File.Exists(sfile)) continue; zfile.Add(sfile); } zfile.CommitUpdate(); buffer = new byte[ms.Length]; ms.Position = 0; ms.Read(buffer, 0, buffer.Length); } Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlEncode("全部文件.zip")); Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");//防止zip文件名中的中文出现乱码 Response.BinaryWrite(buffer); Response.Flush(); Response.End(); } public class MyNameTransfom : ICSharpCode.SharpZipLib.Core.INameTransform { #region INameTransform 成员 string iuser = "";//可以在此传入一些在重新生成zip中的文件名所需要的参数,可以增加多个。 public MyNameTransfom(string iuserid) { iuser = iuserid; } public string TransformDirectory(string name) { return name; } //最简单的一行代码搞定:return Path.GetFileName(name); public string TransformFile(string name) { string sfilename = ""; string zsid = Path.GetFileNameWithoutExtension(name); DataTable dt = SqlTy.ExecuteDatatable("select * from zs where zs_id=‘" + zsid + "‘"); //一次zipfile.Add(filename)方法至少会调用本方法两次 //第二次传入的文件名实际上是第一次被调用返回的文件名 //所以本处做了处理,直接返回传入的文件名 if (dt.Rows.Count < 1) { sfilename = name; } else//下面的代码是根据用户自己设置的文件名命名规则生成新的文件名,有兴趣再看^_^否则自己重做吧 { DataTable dtfilename = SqlTy.ExecuteDatatable("select lmyw from wjmpz where yhid=‘" + iuser + "‘ order by sid"); if (dtfilename.Rows.Count > 0) { for (int i = 0; i < dtfilename.Rows.Count; i++) { sfilename += dt.Rows[0][dtfilename.Rows[i][0].ToString()].ToString()+"_"; } sfilename = sfilename.TrimEnd(‘_‘); } else { sfilename = dt.Rows[0]["zs_zsh"].ToString(); } } sfilename += ".pdf"; return sfilename; } #endregion } }
标签:
原文地址:http://www.cnblogs.com/caids/p/5434527.html