源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

用ASP.Net实现文件的在线压缩和解压缩

  • 时间:2021-10-26 01:26 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:用ASP.Net实现文件的在线压缩和解压缩
  我们经常会遇到批量上传的问题,也会遇到将某个目录下所有文件都上传到服务器上的问题。那么,如何解决此类问题呢?以前的技术一般采用ActiveX等方式,这里笔者采用SharpZlib来实现,听说VS2005已有压缩和解压缩的解决方案,笔者还没有时间用VS2005,所以就只好使用VS2003 + SharpZlib来解决问题了。   1、首先从[url=http://jaist.dl.sourceforge.net/sourceforge/sharpdevelop/084SharpZipLib_SourceSamples.zip]这里[/url]下载0.84版本的SharpZlib源码及示例码。   2、下载下来之后你发现它没有VS2003的解决方案文件,没有关系。你可以自己建立,首先新建一个ZipUnzip的解决方案,然后,将上面经过解压缩之后的所有文件及目录COPY到你的解决方案所在的目录下。   3、在VS2003解决方案资源管理器(一般是在右上方中部点的位置)中点击显示所有文件按钮,然后可以见到很多“虚”的图标、文件及文件夹等,可以一次选择它们,然后包含进项目中。   4、编译,最好使用Release选项,编译完成之后你可以在binRelease看到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:testa.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:testa.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压缩包的问题,没有时间解决了,各位如有解决方案,不妨共享一下。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部