实现asp.net的文件压缩、解压、下载

很早前就想做文件的解压、压缩、下载 了,不过一直没时间,现在项目做完了,今天弄了下。不过解压,压缩的方法还是看的网上的,嘻嘻~~不过我把它们综合了一下哦。呵呵~~

1.先要从网上下载一个icsharpcode.sharpziplib.dll

2.建立类AttachmentUnZip,内容如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
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;
using System.IO;
/// <summary>
///AttachmentUnZip 的摘要说明
/// </summary>
public class AttachmentUnZip
{
    public AttachmentUnZip()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    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);
    }
}
3.建立类UnZipClass,内容如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
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;
/// <summary>
///UnZipClass 的摘要说明
/// </summary>
public class UnZipClass
{
    public UnZipClass()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    /// <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;
        }
    }

}
4.建立类ZipClass,内容如下:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
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;
/// <summary>
///ZipClass 的摘要说明
/// </summary>
public class ZipClass
{
    public ZipClass()
    {
        //
        //TODO: 在此处添加构造函数逻辑
        //
    }
    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();
    }
}
5.类建好了,接下来建立测试页了。呵呵~~EcodeZipRar.aspx,哦,对了,忘了说了,我还在网站外层目录下建了一个文件夹FileZip,用来存放文件的。

前台页面显示:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="EcodeZipRar.aspx.cs" Inherits="EcodeZipRar" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    添加要压缩的文件:<asp:fileupload ID="Fileupload1" runat="server"></asp:fileupload>
        <br />
        <asp:Button ID="Button1" runat="server" Text="上传文件" onclick="Button1_Click" />//对于Fileupload1操作的
        <asp:Button ID="Button2" runat="server" onclick="Button2_Click1" Text="开始解压" />//对于Fileupload1操作的
        <asp:Button ID="Button3" runat="server" Text="文件下载" onclick="Button3_Click" /><br />//对于TreeView1操作的
        <asp:TreeView ID="TreeView1" runat="server" ShowCheckBoxes="All">//显示文件夹下的所有文件
        </asp:TreeView>
    </div>
    </form>
</body>
</html>

后台代码操作:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Checksums;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.GZip; 
using System.Runtime.InteropServices;
using Microsoft.Win32;
using System.Diagnostics;
public partial class EcodeZipRar : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        List();
    }
    //实现文件压缩
    protected void Button1_Click(object sender, EventArgs e)
    {
        string[] FileProperties = new string[2];
        string fullName = Fileupload1.PostedFile.FileName;//C:/test/a.txt
        //待压缩文件
        FileProperties[0] = fullName;
        string format = Path.GetExtension(fullName);//文件格式
        string[] type = { ".zip", ".rar" };
        bool isZip = true;//指定文件是否需要压缩
        foreach (string types in type)
        {
            if (format == types)
            {
                isZip = false;
                break;
            }
        }
        string newPath = HttpContext.Current.Server.MapPath("~/FileZip/") + Fileupload1.FileName;
        try
        {
            Fileupload1.SaveAs(newPath);
            if (isZip)
            {
                FileProperties[1] = HttpContext.Current.Server.MapPath("~/FileZip/") + System.IO.Path.GetFileNameWithoutExtension(fullName) + ".zip";
                //如果文件已经存在,则删除原来的文件
                if(File.Exists(FileProperties[1]))
                {
                    File.Delete(FileProperties[1]);
                }
                //压缩后的目标文件
                ZipClass Zc = new ZipClass();
                Zc.ZipFileMain(FileProperties);
                File.Delete(HttpContext.Current.Server.MapPath("~/FileZip/") + Fileupload1.FileName);//删除原始文件
            }
            List();
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert(‘文件上传成功!‘)</script>");
        }
        catch
        {
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert(‘文件上传失败!‘)</script>");
        }
        
    }
 //文件解压
       protected void Button2_Click1(object sender, EventArgs e)
       {
           string fullName = Fileupload1.PostedFile.FileName; ;//C:/test/a.zip
           string format = Path.GetExtension(fullName);//文件格式
           string[] type = { ".zip"};
           bool isUnZip =false;//指定文件是否需要解压
           foreach (string types in type)
           {
               if (format == types)
               {
                   isUnZip = true;
                   break;
               }
           }
           if (isUnZip)
           {
               //解压文件
               AttachmentUnZip.UpZip(fullName);
               string[] FileProperties = new string[2];
               FileProperties[0] = fullName;//待解压的文件
               FileProperties[1] = System.IO.Path.GetDirectoryName(fullName);//解压后放置的目标目录
               UnZipClass UnZc = new UnZipClass();
               try
               {
                   UnZc.UnZip(FileProperties);
                   List();
                   Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert(‘文件解压成功!‘)</script>");
               }
               catch
               {
                   Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert(‘文件解压失败!‘)</script>");
               }
           }
           else
           {
               Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert(‘解压文件格式为zip!‘)</script>");
           }
           
       }
    //获取指定目录下的所有文件
       protected void List()
       {
           TreeView1.Nodes.Clear();
           string[] files = Directory.GetFiles(HttpContext.Current.Server.MapPath("~/FileZip/"));
           foreach (string file in files)
           {
               TreeNode node = new TreeNode();
               node.Text = file;
               TreeView1.Nodes.Add(node);
           }
       }
    //文件下载
       protected void Button3_Click(object sender, EventArgs e)
       {
           foreach (TreeNode node in TreeView1.Nodes)
           {
               if (node.Checked)
               {
                   string path = node.Text;
                   string fileName = Path.GetFileName(path);
                   DownLoad(fileName, path);
               }
           }
       }
       /*
            微软为Response对象提供了一个新的方法TransmitFile来解决使用 Response.BinaryWrite下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。
      代码如下:
      */
    /// <summary>
    /// 
    /// </summary>
    /// <param name="fileName">所下载的文件名</param>
    /// <param name="path">所下载的文件路径</param>
       protected void DownLoad(string fileName, string path)
       {
           try
           {
               Response.ContentType = "application/x-zip-compressed";
               Response.AddHeader("Content-Disposition", "attachment;filename=" + fileName + "");
               string file = Server.MapPath(path);
               Response.TransmitFile(file);
           }
           catch
           {
               Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "success", "<script>alert(‘文件下载失败!‘)</script>");
           }
       }
    
}
呵呵,就这样了,暂时没用多线程的,不知道很多人同时下载或上传会不会有影响呢?多线程可以解决问题吗?暂时还没弄,有时间我再看下,然后与大家分享。呵呵~~

不好意思,忘说了,在FireFox浏览器下Fileupload1.PostedFile.FileName获得的只是文件名,因为安全问题完整路径被屏蔽了,在ie下获得的是完整路径,如果发现不是,可以在工具中的Internet选项中设置的。在firefox下就郁闷了,暂时没发现可以设置的。

时间: 2024-10-12 20:42:53

实现asp.net的文件压缩、解压、下载的相关文章

linux下各种文件压缩解压(转载)

Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲tar命令的基本用法:  tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面 来举例说明一下:  # tar -cf all.tar *.jpg  这条命令是将所有.jpg的文件打成一个名为all.tar的包.-c是表示产生新的包 ,-f指定包的文件名.  # tar -

linux驱动系列之文件压缩解压小节(转)

转至网页:http://www.jb51.net/LINUXjishu/43356.html Linux下最常用的打包程序就是tar了,使用tar程序打出来的包我们常称为tar包,tar包文件的命令通常都是以.tar结尾的.生成tar包后,就可以用其它的程序来进 行压缩了,所以首先就来讲讲tar命令的基本用法: tar命令的选项有很多(用man tar可以查看到),但常用的就那么几个选项,下面 来举例说明一下: # tar -cf all.tar *.jpg 这条命令是将所有.jpg的文件打成一

Linux之文件压缩解压命令

gzip 命令名称:gzip 命令英文原意:GUN zip 命令所在路劲:bin/gzip 执行权限:所有用户 语法:gzip [文件] 功能描述:压缩文件 压缩后文件格式:.gz gunzip 命令名称:gunzip 命令英文原意:GUN unzip 命令所在路劲:bin/gunzip 执行权限:所有用户 语法:gunzip [压缩文件] 功能描述:解压缩 .gz的压缩文件 范例:gunzip djh.gz tar 命令名称:tar 命令所在路劲:bin/tar 执行权限:所有用户 语法:ta

tar.gz文件压缩解压方法

文件的压缩及解压命令老是记不住,所以简单做了一下整理. 1.tar.gz文件解压 # tar cvfz backup.tar.gz /xxx/ -c, --create create a new archive -v, --verbose verbosely list files processed -f, --file [HOSTNAME:]F use archive file or device F (default /dev/rmt0) -z, --gzip, --ungzip filte

ST MCU生成PDF+文件压缩解压

之前碰到过,STM32F407上做文件压缩,无奈压缩文件时,哈夫曼编码需要耗费很大的RAM,导致失败.后来在论坛坛主的帮助下,了解了LZ77压缩. 今天看论坛的时候,了解到MCU上,用pdflib库,可以做PDF文件的生成.(https://github.com/AndreRenaud/PDFGen) 做下笔记,以备后面用到

压缩解压命令

压缩解压命令 :gzip命令名称:gzip命令英文原意:GNU zip命令所在路径:/bin/gzip执行权限:所有用户语法:gzip [文件]功能描述:压缩文件压缩后文件格式:.gz 压缩解压命令 :gunzip命令名称:gunzip命令英文原意:GNU unzip命令所在路径:/bin/gunzip执行权限:所有用户语法:gunzip [压缩文件]功能描述:解压缩.gz的压缩文件范例: $ gunzip boduo.gz  或 $ gzip -d boduo.gz gzip 只能压缩文件,不

基于哈夫曼编码的压缩解压程序

这个程序是研一上学期的课程大作业.当时,跨专业的我只有一点 C 语言和数据结构基础,为此,我查阅了不少资料,再加上自己的思考和分析,实现后不断调试.测试和完善,耗时一周左右,在 2012/11/19 完成.虽然这是一个很小的程序,但却是我完成的第一个程序. 源码托管在 Github:点此打开链接 一.问题描述: 名称:基于哈夫曼编码的文件压缩解压 目的:利用哈夫曼编码压缩存储文件,节省空间 输入:任何格式的文件(压缩)或压缩文件(解压) 输出:压缩文件或解压后的原文件 功能:利用哈夫曼编码压缩解

linux笔记:linux常用命令-压缩解压命令

压缩解压命令:gzip(压缩文件,不保留原文件.这个命令不能压缩目录) 压缩解压命令:gunzip(解压.gz的压缩文件) 压缩解压命令:tar(打包压缩目录或者解压压缩文件.打包的意思是把目录打包成一个文件,不等同于压缩.tar命令可以在打包的同时进行压缩,得到.tar.gz文件) 压缩解压命令:zip(压缩文件或者目录,会保留原文件) 压缩解压命令:unzip(解压.zip的压缩文件) 压缩解压命令:bzip2(压缩文件) 压缩解压命令:bunzip2(解压.bz2的文件)

Linux-常用命令(4)压缩解压命令

压缩解压命令:gzip 命令名称:gzip 命令英文原意:GNU zip 命令所在路劲:/bin/gzip 执行权限:所有用户 功能描述:压缩文件 压缩后的文件格式: .gz 语法:gzip  [文件] ---------------------------------------------------- 压缩解压命令:gunzip 命令名称:gunzip 命令英文原意:GNU unzip 命令所在路劲:/bin/gunzip 执行权限:所有用户 功能描述:解压缩.gz的压缩文件 压缩后的文件

c#自带类实现的多文件压缩和解压

c#自带的System.IO.Compression命名空间下的压缩类实现的多文件压缩和解压功能,缺点是多文件压缩包的解压只能调用自身的解压方法,和现有的压缩软件不兼容.下面的代码没有把多文件的目录结构加进去 using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; namespace Test.Zip { class CompressHelper { /// <su