zoukankan      html  css  js  c++  java
  • 实现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下就郁闷了,暂时没发现可以设置的。

  • 相关阅读:
    golang 类型断言的学习
    如何查询每个用户的第二条记录
    PHP Slim 框架初体验之无法访问控制器
    jquery循环遍历radio单选按钮,并设置选中状态
    CI框架中自定义view文件夹位置
    PHP代码实现MySQL读写分离
    mysql实现主从复制
    wildflyのデプロイ後の保存位置
    postgresql function
    shell backup
  • 原文地址:https://www.cnblogs.com/ranran/p/3994439.html
Copyright © 2011-2022 走看看