ASP.NET MVC自定义ActionResult实现文件压缩
有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个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实现文件压缩的更多相关文章
- ASP.NET MVC 自定义Razor视图WorkContext
概述 1.在ASP.NET MVC项目开发的过程中,我们经常需要在cshtml的视图层输出一些公用信息 比如:页面Title.服务器日期时间.页面关键字.关键字描述.系统版本号.资源版本号等 2.普通 ...
- ASP.NET MVC之读取服务器文件资源的两种方式
初次认识asp.net mvc时,以为所有文件都需要走一遍路由,然后才能在客户端显示, 所以我首先介绍这一种方式 比如说:我们在服务器上有图片: ~/resource/image/5.jpg 我们就需 ...
- asp.net mvc 自定义pager封装与优化
asp.net mvc 自定义pager封装与优化 Intro 之前做了一个通用的分页组件,但是有些不足,从翻页事件和分页样式都融合在后台代码中,到翻页事件可以自定义,再到翻页和样式都和代码分离, 自 ...
- ASP.NET MVC 自定义路由中几个需要注意的小细节
本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...
- Asp.net Mvc 自定义Session (二)
在 Asp.net Mvc 自定义Session (一)中我们把数据缓存工具类写好了,今天在我们在这篇把 剩下的自定义Session写完 首先还请大家跟着我的思路一步步的来实现,既然我们要自定义Ses ...
- Asp.net mvc 自定义全局的错误事件HandleErrorAttribute无效
Asp.net mvc 自定义全局的错误事件HandleErrorAttribute,结果无效, 原因: 1.没有在RegisterGlobalFilters 里面添加或者你要的位置添加. 2.你把这 ...
- ASP.NET MVC自定义验证Authorize Attribute(包含cookie helper)
前几天Insus.NET有在数据库实现过对某一字段进行加密码与解密<使用EncryptByPassPhrase和DecryptByPassPhrase对MS SQLServer某一字段时行加密和 ...
- asp.net MVC 自定义模型绑定 从客户端中检测到有潜在危险的 Request.QueryString 值
asp.net mvc 自定义模型绑定 有潜在的Requset.Form 自定义了一个模型绑定器.前端会传过来一些敏感字符.调用bindContext. valueProvider.GetValue( ...
- C# MVC 自定义ActionResult实现EXCEL下载
前言 在WEB中,经常要使用到将数据转换成EXCEL,并进行下载.这里整理资料并封装了一个自定义ActionResult类,便于使用.如果文章对你有帮助,请点个赞. 话不多少,这里转换EXCEL使用的 ...
随机推荐
- 微信小程序开发感受
研究了大概有一个多星期的小程序了,说一下感受,之后会随时更新,一边学习,一边加上一部分学习代码和心得.我是一个前端厂里的新手,搬砖的时间不是很长,所以到一部分知识的理解浅之又浅,所以只能说自己的理解, ...
- XMPP环境搭建
搭建XMPP环境需要几个辅助工具 1.XAMPP XAMPP(Apache+MySQL+PHP+PERL)是一个功能强大的建 XAMPP 软件站集成软件包. 许多人通过他们自己的经验认 ...
- LBWE更新模式切换问题:缓存清理
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- java内存泄漏的经典案例
这篇文章主要介绍了Java中典型的内存泄露问题和解决方法,典型的内存泄露例子是一个没有实现hasCode和 equals方法的Key类在HashMap中保存的情况,可以通过实现Key类的equals和 ...
- Javascript学习笔记:闭包题解(2)
代码: var name='The Window'; var object={ name:'My Object', getNameFunc:function(){ return function(){ ...
- Node聊天程序实例03:chat.js
作者:vousiu 出处:http://www.cnblogs.com/vousiu 本实例参考自Mike Cantelon等人的<Node.js in Action>一书. chat.j ...
- numpy函数白板
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False) start 起始位置 stop 终止位置 num 个数 endpoi ...
- 比较评测epoll,select,and poll 时间机制
https://www.ncbi.nlm.nih.gov/geo/query/acc.cgi?acc=GSE21815
- IRLS(迭代加权最小二乘)
IRLS用于解决这种目标函数的优化问题(实际上是用2范数来近似替代p范数,特殊的如1范数). 可将其等价变形为加权的线性最小二乘问题: 其中W(t)可看成对角矩阵,每步的w可用下面的序列代替 如果 p ...
- SQLServer字符操作
1.CHARINDEX('A',‘VALUE’) result:2 style:PATINDEX(varchar,varchar) 解释:A在字符串VALUE的位置次序. 2.PATINDEX( ...