博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Asp.NET中如何一次性下载多个文件
阅读量:5318 次
发布时间:2019-06-14

本文共 2774 字,大约阅读时间需要 9 分钟。

在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

你可能感兴趣的文章
四叶草社交平台——十天冲刺(10)
查看>>
Linux 2.6 完全公平调度算法CFS(Completely Fair Scheduler)分析
查看>>
海量数据处理面试题集锦
查看>>
【设计模式】命令模式
查看>>
pyinstaller---将py文件打包成exe
查看>>
readonly和const的区别
查看>>
SSM框架搭建(四) springmvc和mybatis的配置
查看>>
UVa 11346 - Probability
查看>>
python数据类型之间的转换
查看>>
微软职位内部推荐-SDEII
查看>>
微软职位内部推荐-SENIOR SOFTWARE ENGINEER
查看>>
Redis系统性介绍
查看>>
(备忘)打开office2010总是在配置进度
查看>>
jquery中的ajax方法(备忘)
查看>>
iOS基础-高级视图-UITableView--静态单元格
查看>>
打印图片的属性和实现另存图片功能以及使用numpy
查看>>
IOS-网络(大文件下载)
查看>>
基于MySQL的高可用可扩展架构探讨
查看>>
linux系统服务设置命令--chkconfig命令参数及用法详解
查看>>
0714M
查看>>