asp.net 文件下载与压缩

1.添加ICSharpCode.SharpZipLib.dll(该组件是压缩组件)

2.添加一个压缩辅助类,可以压缩多个文件

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using ICSharpCode.SharpZipLib.Checksums;

 

namespace CSharpZipLibHelper
{
    public class SharpZipLibHelper
    {
        // <summary> 
        /// 压缩指定文件生成ZIP文件 
        /// </summary> 
        /// <param name="topDirName">顶层文件夹名称 \Storage Card\PDADataExchange\send\xml\</param> 
        /// <param name="fileNamesToZip">待压缩文件列表  file名 ddd.txt</param> 
        /// <param name="ZipedFileName">ZIP文件  \Storage Card\PDADataExchange\send\zip\version.zip</param> 
        /// <param name="CompressionLevel">压缩比  7</param> 
        /// <param name="password">密码 ""</param> 
        /// <param name="comment">压缩文件注释文字  ""</param> 
        public static void ZipFile(string topDirName, string[] fileNamesToZip, string ZipedFileName, int CompressionLevel, string password, string comment)
        {
            using (ZipOutputStream s = new ZipOutputStream(System.IO.File.Open(ZipedFileName, FileMode.Create)))
            {
                if (password != null && password.Length > 0)
                    s.Password = password;

                if (comment != null && comment.Length > 0)
                    s.SetComment(comment);

                s.SetLevel(CompressionLevel); // 0 - means store only to 9 - means best compression 
                foreach (string file in fileNamesToZip)
                {
                    using (FileStream fs = File.OpenRead(Path.Combine(topDirName, file)))   //打开待压缩文件 
                    {
                        byte[] buffer = new byte[fs.Length];
                        fs.Read(buffer, 0, buffer.Length);      //读取文件流 
                        ZipEntry entry = new ZipEntry(file);    //新建实例 
                        entry.DateTime = DateTime.Now;
                        entry.Size = fs.Length;
                        fs.Close();
                        s.PutNextEntry(entry);
                        s.Write(buffer, 0, buffer.Length);
                    }
                }
                s.Finish();
                s.Close();
            }
        }

        /// <summary> 
        /// 解压缩ZIP文件到指定文件夹 
        /// </summary> 
        /// <param name="zipfileName">ZIP文件</param> 
        /// <param name="UnZipDir">解压文件夹</param> 
        /// <param name="password">压缩文件密码</param> 
        public static void UnZipFile(string zipfileName, string UnZipDir, string password)
        {
            //zipfileName=@"\Storage Card\PDADataExchange\receive\zip\test.zip";
            //UnZipDir= @"\Storage Card\PDADataExchange\receive\xml\";
            //password="";

            ZipInputStream s = new ZipInputStream(File.OpenRead(zipfileName));
            if (password != null && password.Length > 0)
                s.Password = password;
            try
            {
                ZipEntry theEntry;
                while ((theEntry = s.GetNextEntry()) != null)
                {
                    string directoryName = Path.GetDirectoryName(UnZipDir);
                    string pathname = Path.GetDirectoryName(theEntry.Name);
                    string fileName = Path.GetFileName(theEntry.Name);

                    //生成解压目录  
                    pathname = pathname.Replace(":", "$");//处理压缩时带有盘符的问题 
                    directoryName = directoryName + "\\" + pathname;
                    Directory.CreateDirectory(directoryName);

                    if (fileName != String.Empty)
                    {
                        //解压文件到指定的目录 
                        FileStream streamWriter = File.Create(directoryName + "\\" + 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();
            }
        }
    }
}

页面前台代码

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"
    CodeFile="Default.aspx.cs" Inherits="_Default" %>

 

<asp:Content ID="HeaderContent" runat="server" ContentPlaceHolderID="HeadContent">
    <script type="text/javascript">
        var sFeatures = "dialogHeight:50px;dialogWidth:1200px;center:yes;scroll:yes;status:no;";
        function modopen() {
            window.showModalDialog("/Page/hp.aspx", this, sFeatures);
        }
    </script>
</asp:Content>
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <asp:TextBox ID="TextBox1" Text="100000" runat="server"></asp:TextBox>
    <div>
        <asp:Label ID="Label1" runat="server" Text="0" EnableViewState="false"></asp:Label>
        <br />
        <asp:Label ID="Label2" runat="server" Text="0"></asp:Label>
        <br />
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="生成txt" />
        <asp:Button ID="Button3" runat="server" OnClick="Button3_Click" Text="分割txt" />
        <asp:Button ID="Button4" runat="server" OnClick="Button4_Click" Text="下载zip" />
        <input id="Button2" type="button" value="自适应" onclick='modopen();' />
    </div>
</asp:Content>

我这里用了模板页,需要的人就拿那个几个button控件与文本就可以

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Threading;
using System.IO;
using System.Text;
using ICSharpCode.SharpZipLib.BZip2;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Zip.Compression;
using ICSharpCode.SharpZipLib.Zip.Compression.Streams;
using ICSharpCode.SharpZipLib.GZip;
using CSharpZipLibHelper;

 

public partial class _Default : System.Web.UI.Page
{

    string path;
    int identity;
    string rootPath;

    protected void Page_Load(object sender, EventArgs e)
    {
        path = Server.MapPath("/File/File.txt");
        rootPath = Server.MapPath("/File/DownLoad/");
        identity = 45000;
    }


    protected void Button1_Click(object sender, EventArgs e)
    {
        //  Label1.Text = (Int32.Parse(Label1.Text) + 1).ToString();
        //Label2.Text = (Int32.Parse(Label2.Text) + 1).ToString();


        Thread t = new Thread(() => { WriteFile(); });
        t.Start();
        // Response.Write("<script>alert(1)</script>");

    }

    protected void WriteFile()
    {
        int count = int.Parse(TextBox1.Text.Trim());
        FileStream fs = File.Open(path, FileMode.Create, FileAccess.ReadWrite);
        string s = DateTime.Now.ToString("yyyyMMddHHmmss");
        using (StreamWriter sw = new StreamWriter(fs))
        {
            for (int i = 1; i <= count; i++)
            {
                sw.WriteLine(i + ":    " + s + i.ToString());
            }
        }
    }

    protected void Button3_Click(object sender, EventArgs e)
    {

        if (!Directory.Exists(rootPath))
        {
            Directory.CreateDirectory(rootPath);
        }
        Thread t = new Thread(() =>
        {
            FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.ReadWrite);

            using (fs)
            {
                StreamReader sr = new StreamReader(fs);
                StringBuilder sb = new StringBuilder();
                List<string> FileNames = new List<string>();
                string rootPathDate = rootPath + DateTime.Now.Year.ToString() + "\\";
                if (!Directory.Exists(rootPathDate))
                {
                    Directory.CreateDirectory(rootPathDate);
                }

                string line = sr.ReadLine();
                int i = 1;
                int j = 0;
                while (line != null && j < i * identity)
                {
                    sb.AppendLine(line);

                    line = sr.ReadLine();
                    j++;

                    if (line == null || (line != null && j == i * identity))
                    {
                        FileNames.Add(WriteFile(rootPathDate, sb.ToString()));
                        sb = sb.Clear();
                        i++;
                    }
                }

                if (FileNames.Count > 0)
                {
                    Compress(rootPathDate, FileNames);
                }
            }
        });
        t.Start();
    }

    /// <summary>
    /// 写文件
    /// </summary>
    protected string WriteFile(string RootPath, string FileTxt)
    {
        string FileName = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".txt";
        string FilePath = Path.Combine(RootPath, FileName);
        using (FileStream fs = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        {
            StreamWriter sw = new StreamWriter(fs);
            using (sw)
            {
                sw.Write(FileTxt);
            }
        }
        return FileName;
    }

    public string Compress(string RootPath, List<string> filename)
    {
        //   压缩   
        string Name = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".zip";
        string FileName = Path.Combine(RootPath, Name);
        string topPath = Path.GetPathRoot(RootPath);

        SharpZipLibHelper.ZipFile(RootPath, filename.ToArray(), FileName, 7, "", "");

        return FileName;
    }

    protected void Button4_Click(object sender, EventArgs e)
    {
        Page.Response.Clear();
        bool success = ResponseFile(Page.Request, Page.Response, "20101212225148156.zip", @"/File/DownLoad/2010/", 1024000);
        if (!success)
            Response.Write("下载文件出错!");
        Page.Response.End();
    }

    public static bool ResponseFile(HttpRequest _Request, HttpResponse _Response, string _fileName, string _fullPath, long _speed)
    {
        try
        {
            FileStream myFile = new FileStream(HttpContext.Current.Server.MapPath(Path.Combine(_fullPath, _fileName)), FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
            BinaryReader br = new BinaryReader(myFile);
            try
            {
                _Response.AddHeader("Accept-Ranges", "bytes");
                _Response.Buffer = false;
                long fileLength = myFile.Length;
                long startBytes = 0;

                double pack = 10240; //10K bytes
                //int sleep = 200;   //每秒5次   即5*10K bytes每秒
                int sleep = (int)Math.Floor(1000 * pack / _speed) + 1;
                if (_Request.Headers["Range"] != null)
                {
                    _Response.StatusCode = 206;
                    string[] range = _Request.Headers["Range"].Split(new char[] { '=', '-' });
                    startBytes = Convert.ToInt64(range[1]);
                }
                _Response.AddHeader("Content-Length", (fileLength - startBytes).ToString());
                if (startBytes != 0)
                {
                    //Response.AddHeader("Content-Range", string.Format(" bytes {0}-{1}/{2}", startBytes, fileLength-1, fileLength));
                }
                _Response.AddHeader("Connection", "Keep-Alive");
                _Response.ContentType = "application/octet-stream";
                _Response.AddHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(_fileName, System.Text.Encoding.UTF8));

                br.BaseStream.Seek(startBytes, SeekOrigin.Begin);
                int maxCount = (int)Math.Floor((fileLength - startBytes) / pack) + 1;

                for (int i = 0; i < maxCount; i++)
                {
                    if (_Response.IsClientConnected)
                    {
                        _Response.BinaryWrite(br.ReadBytes(int.Parse(pack.ToString())));
                        Thread.Sleep(sleep);
                    }
                    else
                    {
                        i = maxCount;
                    }
                }
            }
            catch
            {
                return false;
            }
            finally
            {
                br.Close();

                myFile.Close();
            }
        }
        catch
        {
            return false;
        }
        return true;
    }
}

后台代码。

直接copy去用就可以

 

 

posted on 2010-12-13 09:14  jianshaohui  阅读(1135)  评论(4编辑  收藏  举报

导航