中华网络安全联盟 收藏本站
设为主页
商务合作
首页 新闻中心 行业动态 软件新闻 安全资讯 病毒预警 漏洞发布 操作系统 Dos Win9x Win2000 WinXP Win2003 WinVista Linux Unix
数据库 DB2 Access MSSQL MySQL Oracle Sybase 编程技术 ASP PHP JSP CGI/Perl XML .Net C/C++/C# VB VC Delphi Java 汇编
安全技术 安全教学 工具介绍 漏洞利用 病毒防范 入侵检测 防火墙 安全防范 汉化破解 攻击实例 加密解密 进程知识 技术论坛
中华网络安全联盟 >> 程序开发 >> .Net >> 用ASP.Net实现在线压缩和解压缩
程序开发
Asp
PHP
JSP
CGI/Perl
XML
.Net
C/C++/C#
Visual Basic
Visual C++
Delphi
Java
汇编语言
用在JavaScript的Requ
ASP.NET2.0中控件的简
asp.net客户端回调功能
ASP.Net用MD5和SHA1加
asp.net中生成缩略图并
ASP.NET 设计中的 N 个
asp.net读取数据库乱码
ASP.NET1.1中动态树的
用ASP.Net实现在线压缩和解压缩
字体:

中华网络安全联盟    作者:奇趣    来源:奇趣技术网    时间:2008-5-28 11:31:02

我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题。那么,如何解决此类问题呢?以前的技术一般采用ActiveX等方式,这里笔者采用SharpZlib来实现,听说VS2005已有压缩和解压缩的解决方案,笔者还没有时间用VS2005,所以就只好使用VS2003 + SharpZlib来解决问题了。
1、首先从这里下载0.84版本的SharpZlib源码及示例码。
2、下载下来之后你发现它没有VS2003的解决方案文件,没有关系。你可以自己建立,首先新建一个ZipUnzip的解决方案,然后,将上面经过解压缩之后的所有文件及目录COPY到你的解决方案所在的目录下。
3、在VS2003解决方案资源管理器(一般是在右上方中部点的位置)中点击显示所有文件按钮,然后可以见到很多“虚”的图标、文件及文件夹等,可以一次选择它们,然后包含进项目中。
4、编译,最好使用Release选项,编译完成之后你可以在\bin\Release\看到ZipUnzip.dll的类了。如果你编译时报错,说什么AssemblyKeyFile之类的,你可以使用强命名工具新建一个,也可以将AssemblyInfo.cs中[assembly: AssemblyKeyFile("。。。。。")]改成:[assembly: AssemblyKeyFile("")] (不推荐这样做)。
5、新建一个WEBFORM项目,添加ZipUnzip.dll类的引用,然后添加如下文件及内容:

// ------------------------------------------
// 1. AttachmentUnZip.cs
// ------------------------------------------
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
public class AttachmentUnZip
{
public AttachmentUnZip()
{
}
public static void UpZip(string zipFile)
{
string []FileProperties=new string[2];
FileProperties[0]=zipFile;//待解压的文件
FileProperties[1]=zipFile.Substring(0,zipFile.LastIndexOf("")+1);//解压后放置的目标目录
UnZipClass UnZc=new UnZipClass();
UnZc.UnZip(FileProperties);
}
}
}

// ---------------------------------------------
// 2. UnZipClass.cs
// ---------------------------------------------

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
public class UnZipClass
{
/// <summary>
/// 解压文件
/// </summary>
/// <param name="args">包含要解压的文件名和要解压到的目录名数组</param>
public void UnZip(string[] args)
{
ZipInputStream s = new ZipInputStream(File.OpenRead(args[0]));
try
{
ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(args[1]);
string fileName = Path.GetFileName(theEntry.Name);

//生成解压目录
Directory.CreateDirectory(directoryName);

if (fileName != String.Empty)
{
//解压文件到指定的目录
FileStream streamWriter = File.Create(args[1]+fileName);

int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
}
catch(Exception eu)
{
throw eu;
}
finally
{
s.Close();
}

}//end UnZip

public static bool UnZipFile(string file, string dir)
{
try
{
if (!Directory.Exists(dir))
Directory.CreateDirectory(dir);
string fileFullName = Path.Combine(dir,file);
ZipInputStream s = new ZipInputStream(File.OpenRead( fileFullName ));

ZipEntry theEntry;
while ((theEntry = s.GetNextEntry()) != null)
{
string directoryName = Path.GetDirectoryName(theEntry.Name);
string fileName = Path.GetFileName(theEntry.Name);

if (directoryName != String.Empty)
Directory.CreateDirectory( Path.Combine(dir, directoryName));

if (fileName != String.Empty)
{
FileStream streamWriter = File.Create( Path.Combine(dir,theEntry.Name) );
int size = 2048;
byte[] data = new byte[2048];
while (true)
{
size = s.Read(data, 0, data.Length);
if (size > 0)
{
streamWriter.Write(data, 0, size);
}
else
{
break;
}
}

streamWriter.Close();
}
}
s.Close();
return true;
}
catch (Exception)
{
throw;
}
}

}//end UnZipClass
}

// ----------------------------------------------
// 3. ZipClass.cs
// ----------------------------------------------
using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;

namespace WebZipUnzip
{
/// <summary>
/// 压缩文件
/// </summary>
public class ZipClass
{
public void ZipFile(string FileToZip, string ZipedFile ,int CompressionLevel, int BlockSize,string password)
{
//如果文件没有找到,则报错
if (! System.IO.File.Exists(FileToZip))
{
throw new System.IO.FileNotFoundException("The specified file " + FileToZip + " could not be found. Zipping aborderd");
}

System.IO.FileStream StreamToZip = new System.IO.FileStream(FileToZip,System.IO.FileMode.Open , System.IO.FileAccess.Read);
System.IO.FileStream ZipFile = System.IO.File.Create(ZipedFile);
ZipOutputStream ZipStream = new ZipOutputStream(ZipFile);
ZipEntry ZipEntry = new ZipEntry("ZippedFile");
ZipStream.PutNextEntry(ZipEntry);
ZipStream.SetLevel(CompressionLevel);
byte[] buffer = new byte[BlockSize];
System.Int32 size =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,size);
try
{
while (size < StreamToZip.Length)
{
int sizeRead =StreamToZip.Read(buffer,0,buffer.Length);
ZipStream.Write(buffer,0,sizeRead);
size += sizeRead;
}
}
catch(System.Exception ex)
{
throw ex;
}
ZipStream.Finish();
ZipStream.Close();
StreamToZip.Close();
}

public void ZipFileMain(string[] args)
{
//string[] filenames = Directory.GetFiles(args[0]);
string[] filenames = new string[]{args[0]};

Crc32 crc = new Crc32();
ZipOutputStream s = new ZipOutputStream(File.Create(args[1]));

s.SetLevel(6); // 0 - store only to 9 - means best compression

foreach (string file in filenames)
{
//打开压缩文件
FileStream fs = File.OpenRead(file);
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
ZipEntry entry = new ZipEntry(file);

entry.DateTime = DateTime.Now;

// set Size and the crc, because the information
// about the size and crc should be stored in the header
// if it is not set it is automatically written in the footer.
// (in this case size == crc == -1 in the header)
// Some ZIP programs have problems with zip files that don't store
// the size and crc in the header.
entry.Size = fs.Length;
fs.Close();

crc.Reset();
crc.Update(buffer);

entry.Crc = crc.Value;

s.PutNextEntry(entry);

s.Write(buffer, 0, buffer.Length);

}
s.Finish();
s.Close();
}
}
}

// ---------------------------------------------
// 4. WebForm1.aspx
// ---------------------------------------------
<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false" Inherits="WebZipUnzip.WebForm1" %>
<META content="Microsoft Visual Studio .NET 7.1" name=GENERATOR>
<META content=C# name=CODE_LANGUAGE>
<META content=JavaScript name=vs_defaultClientScript>
<META content=http://schemas.microsoft.com/intellisense/ie5 name=vs_targetSchema>
<FORM id=Form1 method=post runat="server"><?xml:namespace prefix = asp /><asp:Button id=Button1 style="Z-INDEX: 101; LEFT: 56px; POSITION: absolute; TOP: 64px" runat="server" Text="压缩"></asp:Button><asp:Button id=Button2 style="Z-INDEX: 102; LEFT: 112px; POSITION: absolute; TOP: 64px" runat="server" Text="解压"></asp:Button><INPUT id=File1 style="Z-INDEX: 103; LEFT: 32px; POSITION: absolute; TOP: 24px" type=file name=File1 runat="server"> </FORM></BODY></HTML>

//-------------------------------------------
// 5.WebForm1.aspx.cs
//-------------------------------------------

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

namespace WebZipUnzip
{
/// <summary>
/// Summary description for WebForm1.
/// </summary>
public class WebForm1 : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button Button1;
protected System.Web.UI.HtmlControls.HtmlInputFile File1;
protected System.Web.UI.WebControls.Button Button2;

private void Page_Load(object sender, System.EventArgs e)
{
// Put user code to initialize the page here
}

#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}

/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.Button1.Click += new System.EventHandler(this.Button1_Click);
this.Button2.Click += new System.EventHandler(this.Button2_Click);
this.Load += new System.EventHandler(this.Page_Load);

}
#endregion

#region 压缩
private void Button1_Click(object sender, System.EventArgs e)
{
string []FileProperties=new string[2];
string fullName=this.File1.PostedFile.FileName;//C:\test\a.txt
string destPath=System.IO.Path.GetDirectoryName(fullName);//C:\test
//待压缩文件
FileProperties[0]=fullName;

//压缩后的目标文件
FileProperties[1]= destPath +""+ System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
ZipClass Zc=new ZipClass();
Zc.ZipFileMain(FileProperties);

//删除压缩前的文件
System.IO.File.Delete(fullName);
}

#endregion

#region 解压
private void Button2_Click(object sender, System.EventArgs e)
{
string fullName=this.File1.PostedFile.FileName;//C:\test\a.zip
//解压文件
//AttachmentUnZip.UpZip(fullName);

// string[] FileProperties = new string[2];
// FileProperties[0] = fullName;//待解压的文件
// FileProperties[1] = System.IO.Path.GetDirectoryName(fullName);//解压后放置的目标目录
// UnZipClass UnZc=new UnZipClass();
// UnZc.UnZip(FileProperties);
string dir = System.IO.Path.GetDirectoryName(fullName);
string fileName = System.IO.Path.GetFileName(fullName);
UnZipClass.UnZipFile(fileName, dir);
}
#endregion
}
}

OK! 试试看。

此方案解决了文件名中文字的问题,目录解压缩问题。
至于整个文件夹批量上传并压缩成一个WINZIP压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下

字体:
 
设为主页 收藏本站 联系我们 友情连接 商务合作 网友留言
Copyright©2006-2008 中华网络安全联盟 All rights reserved.