Asp.NET中如何一次性下载多个文件

在ASP.NET中,我们可以很方便的下载单个文件,当需要一次性下载多个文件的时候,如果提示用户一次一次保存的话,会导致用户体验特别的不好。我这里找到一种比较合理的解决方案,就是先把要下载的所有文件打包压缩到成一个文件,然后再下载下来,然后删除压缩的文件。

下面是代码:

压缩文件:

服务器上的文件名一般和用户上传的文件名有区别,我们这里传入的文件名是这样一种格式(服务器上保存的文件名|原文件名),当然如果服务器上的文件名和原文件名是一样的,则相应的修改代码即可。这里需要用到第三方开源的东西:ICSharpCode.SharpZipLib.dll,这个去DLL之家下载即可。

/// <summary>
/// 压缩文件
/// </summary>
/// <param name="fileName">要压缩的所有文件(完全路径)</param>
/// <param name="name">压缩后文件路径</param>
/// <param name="Level">压缩级别</param>
public void ZipFileMain(string[] filenames, string name, int Level)
{
ZipOutputStream s = new ZipOutputStream(File.Create(name));
Crc32 crc = new Crc32();
//压缩级别
s.SetLevel(Level); // 0 - store only to 9 - means best compression
try
{
foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file.Split('|')[0]);//文件地址
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);

//建立压缩实体
ZipEntry entry = new ZipEntry(file.Split('|')[1]);//原文件名
//时间
entry.DateTime = DateTime.Now;
//空间大小
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
entry.Crc = crc.Value;
s.PutNextEntry(entry);
s.Write(buffer, 0, buffer.Length);
}
}
catch
{
throw;
}
finally
{
s.Finish();
s.Close();
}
}

文件压缩完成之后就可以下载了。因为我的项目中用到了Ajax技术,在用Response.Redirect进行下载的时候,会没有反应,所以新建了一个Download.aspx页面,专门用来下载文件。

listFJ是一个List<string>类型,用来存入要下载的文件名称

string time = DateTime.Now.Ticks.ToString();
ZipFileMain(listFJ.ToArray(), Server.MapPath("../../UploadFile/TempWorkFlow/" + time + ".zip"), 9);//压缩文件
Response.Redirect("Download.aspx?FileName=" + Server.UrlEncode("附件.zip") + "&FilePath=" + Server.MapPath("../../UploadFile/TempWorkFlow/" + time + ".zip"));

Download.aspx页面代码:

protected void Page_Load(object sender, EventArgs e)
{
string fileName = Server.UrlEncode(Request.QueryString["FileName"].ToString());//下载文件的名称(这个可以自定义,如果是中文的话最好Encode一下,防止乱码)
string filePath = Request.QueryString["FilePath"].ToString();//要下载文件路径(全路径)
DownloadFile(fileName, filePath);//下载文件
}

private void DownloadFile(string fileName, string filePath)
{
FileInfo fileInfo = new FileInfo(filePath);
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName);
Response.AddHeader("Content-Length", fileInfo.Length.ToString());
Response.AddHeader("Content-Transfer-Encoding", "binary");
Response.ContentType = "application/octet-stream";
Response.ContentEncoding = System.Text.Encoding.GetEncoding("gb2312");
Response.WriteFile(fileInfo.FullName);
Response.Flush();
File.Delete(filePath);//删除已下载文件
Response.End();
}

至此,可以完成文件批量压缩打包下载了。经过本人严格测试,没有问题,如果大家有什么问题,欢迎留言,当然大家有什么更好的方法,也请不吝赐教! 不喜勿喷...

DLL下载地址:http://files.cnblogs.com/D-Wade-WP8/ICSharpCode.SharpZipLib.zip

转载于:https://www.cnblogs.com/D-Wade-WP8/archive/2013/05/29/Wadeflash20130529001.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295441.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CybersecurityVentures:中小企业将是SIEM市场增长的下一波热点

CybersecurityVentures在2016Q1的一个报告中指出&#xff0c;中小企业将是SIEM市场增长的下一波热点。网安战略群发布了该报告的中文版。报告由GAIA小组的Charlie翻译&#xff0c;转载如下&#xff1a;来源&#xff1a;CybersecurityVentures官网翻译&#xff1a;盖亚(GAIA)小组…

Windows 10 版本 21H2 正式发布

微软今日宣布开始推送 Windows 10 版本 21H2。 Windows 10 版本 21H2 将作为 Windows 10 2021 年 11 月更新向运行 Windows 10 版本 2004、Windows 10 版本 20H2 和 Windows 10 版本 21H1 的电脑推出。 为保证升级效果&#xff0c;Windows 10 版本 21H2 将进行分阶段和可评估的…

Android之开发者应该收藏的优秀博客和技术网站

安居客Trinea 的个人博客 http:// www.trinea.cn codekk 一个Trinea发起的开源项目解析分享站点 微信公众号:codekk http://codekk.com/open-source-project-analysis

成功的换心手术——Windows Phone 8 发布

微软在刚刚开始的 Windows Phone 开发者峰会上正式发布了代号阿波罗的 Windows Phone 8 操作系统。虽然微软之前几乎没在公开场合提过阿波罗&#xff0c;但新系统变化的大方向早已泄漏。不过整个发布会依然充满惊喜&#xff0c;微软整整演示了一个多小时新功能&#xff0c;完全…

世上最“贵”的河:河里石头比黄金还值钱?甚至还有士兵驻守!

全世界只有3.14 % 的人关注了爆炸吧知识大家都听过世界上最长的河是尼罗河世界上最宽的河是亚马逊河但是你知道世界上最“贵”的河是哪条河吗这条河中最贵的原因不是水中有什么特殊生物也不是河里有黄金钻石仅仅是因为这里的“石头”这河里的石头可不普通大都是翡翠原石而这条河…

ASP.NET Core 跨平台图形验证码实现

概述几年前&#xff0c;大部分网站、论坛之类的是没有验证码的&#xff0c;因为对于一般用户来说验证码只是增加了用户的操作&#xff0c;降低了用户的体验。但是后来各种灌水机器人、投票机器人、恶意注册机器人层出不穷&#xff0c;大大增加了网站的负担同时也给网站数据库带…

日常管理

2019独角兽企业重金招聘Python工程师标准>>> 关于目前自己iOS项目使用的第三方开源库 1.AFNetworking 目前比较推荐的iOS网络请求组件&#xff0c;默认网络请求是异步&#xff0c;通过block回调的方式对返回数据进行处理。 2.FMDB 对sqlite数据库操作进行了封装&…

关于input type=file 限制文件上传类型

HTML <input> 标签的 accept 属性 <input type"file" name"pic" id"pic" accept"image/gif, image/jpeg" />accept 的取值是 MIME_type列出素有MIME_type的取值&#xff1a;下列信息摘自w3cschool MIME 类型 MIME (Multip…

System Information for Windows

运行平台&#xff1a;Windows软件授权&#xff1a;自由软件软件大小&#xff1a;1.76MBSystem Information for Windows是一款功能非常强大的系统信息管理工具,除了可查看电脑中所有的软硬件信息,网络信息等这些基本功能外,还可以查看电脑中所有软件的注册信息,包括IE和 Firefo…

Android之android studio如何把项目分享到github并提修改的代码到Github

android studio如何提交代码到Github 第一步、下载git 第二步:在android studio指定git路径 File->Settings 测试Git是否可用

清华伯克利造出机械小强:承重200万倍踩不死,跑得和真蟑螂一样快

全世界只有3.14 % 的人关注了爆炸吧知识打不死的小强&#xff0c;真的是太讨厌了&#xff01;既然打不死&#xff0c;那……干脆仿造一个出来&#xff0c;为我所用&#xff0c;岂不是爽歪歪&#xff1f;还真有人仿造成功了&#xff0c;最新的一期Science Robotics&#xff0c;就…

RowVersion字段从SqlServer到PostgreSQL的迁移

SQL Server 有个列是rowversion&#xff0c;之前是timestamp&#xff0c;因此这两个关键字在SQL server中是同义词&#xff0c;不过目前timestamp处在废弃阶段&#xff0c;因此我们最好使用rowversion来代替它。而在数据库迁移时&#xff0c;因为使用到该类型&#xff0c;因此要…

支付宝手机支付

1 在 "商家服务"开通"移动支付" 2 创建应用

java序列化有什么用_java中序列化的作用

一 什么叫序列化通俗点讲&#xff1a;它是处理对象流的一种机制&#xff0c;即可以很方便的保存内存中java对象的状态&#xff0c;同时也为了方便传输。二 序列化有什么作用1.方便传输&#xff0c;速度快&#xff0c;还很安全&#xff0c;被调用方序列化&#xff0c;调用方反序…

zk 08之:Curator之一:zk客户端Curator

Curator是Netflix公司开源的一个Zookeeper客户端&#xff0c;与Zookeeper提供的原生客户端相比&#xff0c;Curator的抽象层次更高&#xff0c;简化了Zookeeper客户端编程。 它包含以下几个组件&#xff1a; ComponentdescriptionRecipesImplementations of some of the common…

decimal,float和double的区别

一直很奇怪C#的预定义数据类型中为什么加了一个decimal&#xff0c;有float和double不就够了吗&#xff1f;今天来挖一挖。 浮点型 Name CTS Type De script ion Significant Figures Range (approximate) float System.Single 32-bit single-precision f…

Android之调用微信登陆、分享、支付

转载&#xff1a;http://blog.csdn.net/lowprofile_coding/article/details/48086381 前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调过于麻烦,还必须要在指定包名下的actvity进行回调,所以我在这里写一篇博客,有这个需求的朋友可以借鉴一下,以后自己别的项目有用到…

两年发表14篇论文,其中10篇一作,这是她的科研进阶攻略

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;浙江大学两年发表14篇论文&#xff0c;其中一作10篇&#xff0c;包括4篇Top SCI&#xff0c;2篇SCI和4篇EI&#xff1b;持有2项发明专利&#xff0c;出版1部英文专著&#xff0c;斩获2020年度学生学术十大新成果奖第…

生活在任务栏的猫, CPU使用率越高它就跑的越快

生活在任务栏的猫, CPU使用率越高它就跑的越快Runcat 是一个桌面软件, 这只猫会显示在您的任务栏上面, 它会一直奔跑, 它的运行速度取决于CPU的使用率, 支持 Windows 和 Mac 平台。您还可以用它查看系统资源使用率, 包括CPU使用率,内存,电池状态,网络传输速度等。如果这只猫一直…

在Ant的javac中指定源文件编码方式,以避免警告: 编码 GBK 的不可映射字符的错误...

为什么80%的码农都做不了架构师&#xff1f;>>> * 该错误会造成源文件中的字符串出现混乱&#xff0c;从而影响indexOf()之类函数的正常功能&#xff0e; <javac srcdir"${common.src.dir}" destdir"${build.temp.common.classes.dir}" de…