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使用的 ...
随机推荐
- ubuntu一些常用的命令
1.docker里的ubuntu不知道密码,更新密码 sudo passwd 2.解压zip文件 unzip xx.zip 3.安装LAMP (1)sudo apt-get install apach ...
- HTML相关问题
1.XHTML和HTML有什么区别HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须用小 ...
- tomcat启动超时问题
当启动tomcat时候出现 Server Tomcat v6.0 Server at localhost was unable to start within 45 seconds. If the s ...
- 27.solr集群
搭建solr集群整个架构: 前提: (1)zookeeper集群 (2)最好做系统间拷贝免密码(频繁复制东西输密码太麻烦) (3)软件solr.*.zip zookerper.*.tar.gz i ...
- LBWE更新模式切换问题:缓存清理
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- Hibernate的映射文件配置
对象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素,映射文件的代码如下: <?x ...
- jquery总结06-动画事件04-自定义动画
.animate(params,[speed],[easing],[fn]) params,[speed],[easing],[fn]Options,Number/String,String,Func ...
- Docker安装ruby2.1
# sudo apt-get install Python-software-properties# sudo apt-add-repository ppa:brightbox/ruby-ng# su ...
- EJB 简介
EJB: 被称为java企业bean,服务器端组件,核心应用是部署分布式应用程序.用它部署的系统不限定平台.实际上ejb是一种产品,描述了应用组件要解决的标准 标准: 可扩展 (Scalable) ...
- 使用python操作FTP上传和下载
函数释义 Python中默认安装的ftplib模块定义了FTP类,其中函数有限,可用来实现简单的ftp客户端,用于上传或下载文件,函数列举如下 ftp登陆连接 from ftplib import F ...