做web技术有时候要向客户返回一些文件如:excel、word、甚至是一些视频、音频等。但当数据量过大的时候,我们可能要考虑到用要用压缩(或者批量压缩)处理的方式把问价传送给客户端。下面介绍一种功能较为稳定的压缩、解压工具。此处以压缩为例。
第一步:要下载一个第三方的解、压缩组件叫: ICSharpCode.SharpZipLib.dll
第二步:引入到项目的解决方案中。
以上准备工作做好以后下面开干(一下实例为压缩多个文件):
首先在button的click事件中调用压缩的方法:
protected void btnExportZip_Click(object sender, EventArgs e)
{
// 定义一个泛型集合去存储要压缩的源文件的信息
List<FileInfo> fileInfos = new List<FileInfo>();
// 要压缩的问价名集合一个文件名集合
string[] Names = {@"H:/demo1.xls", @"H:/demo2.xls"};
foreach (string filename in Names)
{
FileInfo file = new FileInfo(filename); // 根据返回的文件名获取文件的信息
fileInfos.Add(file); // 添加文件到信息集合
}
// 存储压缩文件名,用GUID防止多次压缩后的文件重复。 Server.MapPath("./excelCD/")为服务器下的一个文件夹存储压缩文件
string zipFileName = Server.MapPath("./excelCD/") + "userInfo" + Guid.NewGuid().ToString() + ".zip";
File.WriteAllText(zipFileName, ""); // 创建空文件
Compress(fileInfos, zipFileName, 2, 800); // 调用压缩方法
}
// 参数依次为:文件信息集合,准备压缩到的文件名,压缩质量(0~9依次增加),休眠时间(单位:毫秒)
public static void Compress(List<FileInfo> fileNames, string zipFileName, int CompressionLevel, int SleepTimer)
{
ZipOutputStream s = new ZipOutputStream(File.Create(zipFileName));
try
{
s.SetLevel(CompressionLevel);
foreach (FileInfo file in fileNames)
{
FileStream fs = null;
try
{
fs = file.Open(FileMode.Open, FileAccess.ReadWrite);
}
catch
{
continue;
}
// 将文件分批读入缓冲区
byte[] data = new byte[2048];
int size = 2048;
ZipEntry entry = new ZipEntry(Path.GetFileName(file.Name));
entry.DateTime = (file.CreationTime > file.LastWriteTime ? file.LastWriteTime : file.CreationTime);
s.PutNextEntry(entry);
while (true)
{
size = fs.Read(data, 0, size);
if (size <= 0) break;
s.Write(data, 0, size);
}
fs.Close();
file.Delete();
Thread.Sleep(SleepTimer);
}
}
finally
{
s.Finish();
s.Close();
}
}
// 做完以上操作就能够找到自己压缩的文件了,但是这只是把文件压缩到自己的服务器上,如果要把压缩后的文件推送到客户端就要用到另一种技术了,请参考我的博客“将文件传送到客户端”