有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个ActionResult,方便进行文件下载
using System;using System.Collections;using System.Collections.Generic;using System.IO;using System.Linq;using System.Text;using System.Web;using System.Web.Mvc;using WebSeat.Site.Member.Helper;namespace WebSeat.Site.Member.CustomResult{/// <summary>/// 说明:压缩文件/// 创建日期:/12/14 16:18:22/// 创建人:曹永承/// </summary>public class ZipResult : ActionResult{#region 字段private Ionic.Zip.ZipFile zip;#endregion#region 属性/// <summary>/// 文档类型/// </summary>public string ContentType{get;set;}/// <summary>/// 下载文件名称/// </summary>public string DownloadName { get; set; }#endregion#region 构造函数public ZipResult(string downLoadName =null){ContentType = "application/x-zip-compressed";DownloadName = downLoadName;zip = new Ionic.Zip.ZipFile(System.Text.Encoding.UTF8);}public ZipResult(params string[] filenames):this(){foreach (string filename in filenames){zip.AddFile(filename);}}public ZipResult(IDictionary<string,Stream> dir, string downLoadName = " ") : this(downLoadName){foreach (string key in dir.Keys){zip.AddEntry(key, dir[key]);}}#endregion#region 公共方法/// <summary>/// 添加文件/// </summary>/// <param name="filename"></param>public void AddFile(string filename){zip.AddFile(filename);}/// <summary>/// 添加流/// </summary>/// <param name="entryName"></param>/// <param name="stream"></param>public void AddEntry(string entryName, Stream stream){zip.AddEntry(entryName, stream);}/// <summary>/// 获取压缩后的流/// </summary>/// <returns></returns>public Stream GetStream(){Stream stream = new MemoryStream();zip.Save(stream);return stream;}#endregion#region 实现ExecuteResult方法public override void ExecuteResult(ControllerContext context){context.HttpContext.Response.ContentType = ContentType;string filename = DateTime.Now.ToString("yyyy_MM_dd_HH_mm_ss")+".zip";filename = DownloadName == null ? filename : DownloadName;//对文件名称进行编码,避免下载文件名称出现乱码filename = filename.EncodingDownloadFileName(); context.HttpContext.Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);Stream ms = GetStream();context.HttpContext.Response.AddHeader("Content-Length", ms.Length.ToString());ms.Seek(0, SeekOrigin.Begin);byte[] bytes = new byte[1024 * 10];int readSize = 0;var output = context.HttpContext.Response.OutputStream;while ((readSize = ms.Read(bytes, 0, bytes.Length)) > 0){output.Write(bytes, 0, readSize);context.HttpContext.Response.Flush();}}#endregion}}