您的位置:首页 > 编程语言 > ASP

asp.net实现文件夹及文件压缩,并实现下载(三)——文件超过150M

2012-04-28 15:16 671 查看
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);

}

}

这个方法先是将生成的压缩包存放到服务器中,然后再下载
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: