有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个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>
/// 说明:压缩文件
/// 创建日期:2016/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(, SeekOrigin.Begin);
byte[] bytes = new byte[ * ];
int readSize = ;
var output = context.HttpContext.Response.OutputStream;
while ((readSize = ms.Read(bytes, , bytes.Length)) > )
{
output.Write(bytes, , readSize);
context.HttpContext.Response.Flush();
}
}
#endregion }
}

ASP.NET MVC自定义ActionResult实现文件压缩的更多相关文章

  1. ASP.NET MVC 自定义Razor视图WorkContext

    概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...

  2. ASP.NET MVC之读取服务器文件资源的两种方式

    初次认识asp.net mvc时,以为所有文件都需要走一遍路由,然后才能在客户端显示, 所以我首先介绍这一种方式 比如说:我们在服务器上有图片: ~/resource/image/5.jpg 我们就需 ...

  3. asp.net mvc 自定义pager封装与优化

    asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...

  4. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  5. Asp.net Mvc 自定义Session (二)

    在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...

  6. Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效

    Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...

  7. ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)

    前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...

  8. asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值

    asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...

  9. C# MVC 自定义ActionResult实现EXCEL下载

    前言 在WEB中,经常要使用到将数据转换成EXCEL,并进行下载.这里整理资料并封装了一个自定义ActionResult类,便于使用.如果文章对你有帮助,请点个赞. 话不多少,这里转换EXCEL使用的 ...

随机推荐

  1. 基于Apache+php+mysql的许愿墙网站的搭建create database xyq; //创建xyq数据库

    1.准备CentOS7与CentOS5的基础配置 2.在两台虚拟机中配置yum. 3.在CentOS7中安装httpd与php与php-mysql PS:截图时已安装 CentOS7 关闭防火墙与se ...

  2. 。linux桌面与命令行

    1.输入用户名和密码登录到系统2.vi /etc/inittab3.修改id:后对应的值为5(桌面模式),id:后对应的值改成3(命令行模式)先用命令#startx启动到桌面模式,然后 Ctrl + ...

  3. 让我们来简单说说mockjs吧!

    背景: 新接手了一个更新CRM的客户管理项目,负责添加三张活动财务表与操作的模块,接到任务时候,后台还没有做数据,所以用到了假数据,So就是这里所说的mockjs. 介绍: mockjs让前端独立于后 ...

  4. linux搭建LAMP

    先简要概述下本文要点:(操作系统采用CentOS6.5 x64) 1.分别安装搭建lamp服务环境: 2.采用lamp一键安装包搭建环境: 3.在lamp环境中初步搭建起一个网站: 一. 分别安装搭建 ...

  5. MySQL存储IP地址操作

    数据库数据表创建语法: DROP TABLE IF EXISTS `admin`; CREATE TABLE IF NOT EXISTS `admin`( `adminid` INT UNSIGNED ...

  6. springmvc接收JSON类型的数据

    1.在使用AJAX传递JSON数据的时候要将contentType的类型设置为"application/json",否则的话会提示415错误 2.传递的data需要时JSON类型的 ...

  7. Eclipse Building Workspace 解决办法

    Eclipse 一直不停 building workspace... android开发论坛 juapk 完美解决总结 一.产生这个问题的原因多种 1.自动升级 2.未正确关闭  3.maven下载l ...

  8. LD_LIBRARY_PATH的设定

    LD_LIBRARY_PATH的设定   变量LD_LIBRARY_PATH 是用来在Linux下设置动态链接库(*.so)的查找路径,我们一般情况下都需要在运行一个带有动态链接库的程序是运行 exp ...

  9. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  10. 第一章 Java的I/O演进之路

    I/O基础入门 Java的I/O演进 第一章 Java的I/O演进之路 1.1 I/O基础入门 1.1.1 Linux网络I/O模型简介 根据UNIX网络编程对I/O模型的分类,UNIX提供了5中I/ ...