asp.net实现文件夹及文件压缩,并实现下载(三)——文件超过150M
来源:互联网 发布:软件测试压力测试 编辑:程序博客网 时间:2024/06/07 00:16
asp.net实现文件夹及文件压缩,并实现下载(三)——文件超过150M
添加引用:ICSharpCode.SharpZipLib.dll
代码:
protected void Button1_Click(object sender, EventArgs e)
{
string filePath = Server.MapPath("files");
string strFileName = HttpUtility.UrlEncode("files").Replace('+', ' ');
string fileName = "files.zip";//客户端保存的文件名
string Path = Server.MapPath(fileName);//路径
System.IO.FileStream iStream = null;
try
{
zos = new ZipOutputStream(File.Create(filePath + ".zip"));//创建压缩文件,保存的服务器中
strBaseDir = filePath + "\\";
addZipEntry(strBaseDir);//压缩文件
zos.Finish();
zos.Close();
//分块下载文件
iStream = System.IO.File.OpenRead(Path);
System.IO.FileInfo fileInfo = new System.IO.FileInfo(Path);
if (fileInfo.Exists == true)
{
const long ChunkSize = 1048576;//1M 每次读取文件,只读取1M,这样可以缓解服务器的压力
byte[] buffer = new byte[ChunkSize];
Response.Clear();
long dataLengthToRead = iStream.Length;//获取下载的文件总大小
Response.ContentType = "application/octet-stream";
Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpUtility.UrlEncode(fileName));
while (dataLengthToRead > 0 && Response.IsClientConnected)
{
int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize));//读取的大小
Response.OutputStream.Write(buffer, 0, lengthRead);
Response.Flush();
dataLengthToRead = dataLengthToRead - lengthRead;
}
Response.Close();
}
zos.Close();
iStream.Close();
Response.End();
Response.Clear();
Response.End();
}
catch (Exception ex)
{
if (iStream != null)
iStream.Close();
////zos.Close();
ScriptManager.RegisterStartupScript(this, GetType(), "alert", "<script>alert('下载有问题!');</script>", false);
}
}
private void addZipEntry(string path)
{
Crc32 crc = new Crc32();
DirectoryInfo di = new DirectoryInfo(path);
FileStream fs = null;
try
{
foreach (DirectoryInfo item in di.GetDirectories())
{
addZipEntry(item.FullName);
}
foreach (FileInfo item in di.GetFiles())
{
fs = File.OpenRead(item.FullName);
if (fs.Length != 0)
{
long fileLength = fs.Length;
long pai = 1024 * 1024 * 20;//每M写一次
long forint = fs.Length / pai + 1;
byte[] buffer = null;
ZipEntry entry = null;
if (fileLength < 104857600)//150 * 1024 * 1024
{
buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string strEntryName = item.FullName.Replace(strBaseDir, "");
entry = new ZipEntry(strEntryName);
zos.PutNextEntry(entry);
zos.Write(buffer, 0, buffer.Length);
}
else
{
entry = new ZipEntry(item.FullName.Replace(strBaseDir, ""));
entry.Size = fs.Length;
entry.DateTime = DateTime.Now;
zos.PutNextEntry(entry);
for (long i = 1; i <= forint; i++)
{
if (pai * i < fs.Length)
{
buffer = new byte[pai];
fs.Seek(pai * (i - 1), System.IO.SeekOrigin.Begin);
}
else
{
if (fs.Length < pai)
{
buffer = new byte[fs.Length];
}
else
{
buffer = new byte[fs.Length - pai * (i - 1)];
fs.Seek(pai * (i - 1), System.IO.SeekOrigin.Begin);
}
}
fs.Read(buffer, 0, buffer.Length);
crc.Reset();
crc.Update(buffer);
zos.Write(buffer, 0, buffer.Length);
zos.Flush();
}
}
}
fs.Close();
}
}
catch (Exception ex)
{
if (fs != null)
fs.Close();
ScriptManager.RegisterStartupScript(this, GetType(), "alert", "<script>alert('压缩有问题!');</script>", false);
}
}
这个方法先是将生成的压缩包存放到服务器中,然后再下载
- asp.net实现文件夹及文件压缩,并实现下载(三)——文件超过150M
- asp.net实现文件夹及文件压缩,并实现下载(二)——文件超过150M
- asp.net实现文件夹及文件压缩,并实现下载
- asp.net实现文件夹及文件压缩,并实现下载(一)
- asp.net 压缩并下载文件
- 实现asp.net的文件压缩、解压、下载
- ASP.NET实现文件下载
- ASP.NET实现文件下载
- ASP.NET实现文件下载
- asp.net实现文件下载
- ASP.NET实现文件下载
- asp.net 实现文件下载
- ASP.net实现文件下载
- ASP.NET实现文件下载
- java实现文件及文件夹压缩
- 用java实现文件下载并压缩
- 在ASP.NET中实现压缩多个文件为.zip文件,实现批量下载功能
- ASP.NET 大文件下载的实现思路及代码
- Java通过反射获取到其类的属性和值
- Making C++ ready for the desktop
- Apache MINA实战之 牛刀小试
- CABAC之手把手教你编码
- Recording DirectX and OpenGL Rendered Animations
- asp.net实现文件夹及文件压缩,并实现下载(三)——文件超过150M
- HandlerSocket的优势和缺陷阐述
- [c#中的xml操作]-------1、新建xml文件并添加结点
- 如何解决TIME_WAIT过多的解决办法(附Socket中的TIME_WAIT状态详解)
- C++ next_permutation 源码分析
- 《玩转.NET Micro Framework 移植-基于STM32F10x处理器》资源汇总
- Linux 文件内容大小写转换
- UBUNTU添加开机自动启动程序方法
- Objective-C的self.用法的一些总结