ASP.Net下載大文件的實(shí)現(xiàn)方法

字號(hào):


    這篇文章主要介紹了ASP.Net下載大文件的實(shí)現(xiàn)方法,較為詳細(xì)的分析了實(shí)現(xiàn)大文件下載的思路及具體注意事項(xiàng),需要的朋友可以參考下
    本文實(shí)例講述了ASP.Net下載大文件的實(shí)現(xiàn)方法。分享給大家供大家參考。具體分析如下:
    當(dāng)我們的網(wǎng)站需要支持下載大文件時(shí),如果不做控制可能會(huì)導(dǎo)致用戶在訪問下載頁面時(shí)發(fā)生無響應(yīng),使得瀏覽器崩潰。可以參考如下代碼來避免這個(gè)問題。
    關(guān)于此代碼的幾點(diǎn)說明:
    1. 將數(shù)據(jù)分成較小的部分,然后將其移動(dòng)到輸出流以供下載,從而獲取這些數(shù)據(jù)。
    2. 根據(jù)下載的文件類型來指定 Response.ContentType 。(參考OSChina的這個(gè)網(wǎng)址可以找到大部分文件類型的對(duì)照表:)
    3. 在每次寫完response時(shí)記得調(diào)用 Response.Flush()
    4. 在循環(huán)下載的過程中使用 Response.IsClientConnected 這個(gè)判斷可以幫助程序盡早發(fā)現(xiàn)連接是否正常。若不正常,可以及早的放棄下載,以釋放所占用的服務(wù)器資源。
    5. 在下載結(jié)束后,需要調(diào)用 Response.End() 來保證當(dāng)前線程可以在最后被終止掉。
    代碼如下:
    using System;
    namespace WebApplication1
    {
    public partial class DownloadFile : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    System.IO.Stream iStream = null;
    // Buffer to read 10K bytes in chunk:
    byte[] buffer = new Byte[10000];
    // Length of the file:
    int length;
    // Total bytes to read.
    long dataToRead;
    // Identify the file to download including its path.
    string filepath = Server.MapPath("/") +"./Files/TextFile1.txt";
    // Identify the file name.
    string filename = System.IO.Path.GetFileName(filepath);
    try
    {
    // Open the file.
    iStream = new System.IO.FileStream(filepath, System.IO.FileMode.Open,
    System.IO.FileAccess.Read, System.IO.FileShare.Read);
    // Total bytes to read.
    dataToRead = iStream.Length;
    Response.Clear();
    Response.ClearHeaders();
    Response.ClearContent();
    Response.ContentType = "text/plain"; // Set the file type
    Response.AddHeader("Content-Length", dataToRead.ToString());
    Response.AddHeader("Content-Disposition", "attachment; filename=" + filename);
    // Read the bytes.
    while (dataToRead > 0)
    {
    // Verify that the client is connected.
    if (Response.IsClientConnected)
    {
    // Read the data in buffer.
    length = iStream.Read(buffer, 0, 10000);
    // Write the data to the current output stream.
    Response.OutputStream.Write(buffer, 0, length);
    // Flush the data to the HTML output.
    Response.Flush();
    buffer = new Byte[10000];
    dataToRead = dataToRead - length;
    }
    else
    {
    // Prevent infinite loop if user disconnects
    dataToRead = -1;
    }
    }
    }
    catch (Exception ex)
    {
    // Trap the error, if any.
    Response.Write("Error : " + ex.Message);
    }
    finally
    {
    if (iStream != null)
    {
    //Close the file.
    iStream.Close();
    }
    Response.End();
    }
    }
    }
    }
    希望本文所述對(duì)大家的asp.net程序設(shè)計(jì)有所幫助。