有时候需要将单个或多个文件进行压缩打包后在进行下载,这里我自定义了一个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(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}
}

ASP.NET MVC自定义ActionResult实现文件压缩相关推荐

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

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

  2. ASP.NET MVC实现简单的文件上传与下载

    使用ASP.NET MVC实现简单的文件上传与下载. 1.上传文件HTML <form action='@Url.Action("Upload", "File&qu ...

  3. 使用mvc模式读取服务器上的文件,ASP.NET MVC之读取服务器文件资源的两种方式

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

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

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

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

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

  6. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)

    一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...

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

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

  8. ASP.net MVC自定义错误处理页面的方法

    在ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那 ...

  9. 【转】ASP.net MVC自定义错误处理页面的方法

    在ASP.NET MVC中,我们可以使用HandleErrorAttribute特性来具体指定如何处理Action抛出的异常.只要某个Action设置了HandleErrorAttribute特性,那 ...

最新文章

  1. linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)
  2. optee3.16.0 qemu_v8的环境搭建篇(ubuntu20.10)
  3. nyoj116士兵杀敌2
  4. leetcode 687. Longest Univalue Path | 687. 最长同值路径(树形dp)
  5. Android的Toast介绍-android学习之旅(三十六)
  6. 行为像指针的类的对象每次作为参数传入函数或者传出函数时都要小心
  7. 为什么这么多应届生要进入互联网行业?
  8. 【BZOJ 3505】 [Cqoi2014]数三角形 容斥原理+排列组合+GCD
  9. 34_注解的定义与反射调用
  10. STM32F4: Generating parallel signals with the FSMC
  11. 为什么电脑不能安全关闭计算机,电脑无法正常关机的原因以及解决办法
  12. godot引擎学习4
  13. 【zookeeper】Apache curator优点介绍
  14. c语言编程电话簿,C语言实现电话簿项目.pdf
  15. 【EI会议分享】2022年第三届智能制造与自动化前沿国际会议(CFIMA 2022)
  16. 设随机变量用计算机模拟,概率论实验报告1.docx
  17. 计算机视觉有哪些SCI期刊? - 易智编译EaseEditing
  18. 百战程序员python资源_【百战程序员】Python 文件I/O
  19. 阿里巴巴的P8架构师会辞职吗?
  20. 详解叠瓦式磁记录SMR盘基础知识

热门文章

  1. C++之Boost使用
  2. 取代java_如何评价 Kotlin?未来是否会取代 Java?
  3. python对象模型 ruby_使用JRuby/Jython实现Ruby/Python的互操作性?
  4. resin php,resin竟然开始支持PHP
  5. java ftp pasv_Ftp主动模式和被动模式以及java连接ftp模式设置
  6. 渥太华大学计算机硕士课程,渥太华大学计算机工程专业解析
  7. mysql 多少个数据库_mysql数据库的几个基本概念
  8. 一台支持vlan管理的交换机_关于交换机的VLAN技术你了解多少?
  9. c语言——求单词个数
  10. iOS 高德导航按返回后报错 解决