C# Response 下載


//TransmitFile實現下載  
    protected void Button1_Click(object sender, EventArgs e)  
    {  
        /* 
         微軟為Response對象提供了一個新的方法TransmitFile來解決使用Response.BinaryWrite 
         下載超過400mb的文件時導致Aspnet_wp.exe進程回收而無法成功下載的問題。 
         代碼如下: 
         */  
  
        Response.ContentType = "application/x-zip-compressed";  
        string FileName = "test.doc";  
        //使用UTF-8對文件名進行編碼  
        Response.AppendHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(FileName, System.Text.Encoding.UTF8) + "\"");  
        Response.ContentType = "application/octet-stream";  
        Response.AddHeader("Content-Disposition", "attachment;filename=" + FileName);  
        string filename = Server.MapPath("../ReportTemplate/test.doc");  
        Response.TransmitFile(filename);  
    }  
  
    //WriteFile實現下載  
    protected void Button2_Click(object sender, EventArgs e)  
    {  
         /* 
         using System.IO;          
         */  
        string fileName = "test.doc";//客戶端保存的文件名  
        string filePath = Server.MapPath("../ReportTemplate/test.doc");//路徑  
        FileInfo fileInfo = new FileInfo(filePath);  
        Response.Clear();  
        Response.ClearContent();  
        Response.ClearHeaders();  
        Response.AddHeader("Content-Disposition", "attachment;filename=\"" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) + "\"");  
        Response.AddHeader("Content-Length", fileInfo.Length.ToString());  
        Response.AddHeader("Content-Transfer-Encoding", "binary");  
        Response.ContentType = "application/octet-stream";  
        Response.WriteFile(fileInfo.FullName);  
        Response.Flush();  
        Response.End();  
    }  
  
    //WriteFile分塊下載  
    protected void Button3_Click(object sender, EventArgs e)  
    {  
        string fileName = "test.doc";//客戶端保存的文件名  
        string filePath = Server.MapPath("../ReportTemplate/test.doc");//路徑  
  
  
        System.IO.FileInfo fileInfo = new System.IO.FileInfo(filePath);  
  
  
        if (fileInfo.Exists == true)  
        {  
            const long ChunkSize = 102400; //100K 每次讀取文件,只讀取100K,這樣可以緩解服務器的壓力  
            byte[] buffer = new byte[ChunkSize];  
  
  
            Response.Clear();  
            System.IO.FileStream iStream = System.IO.File.OpenRead(filePath);  
            long dataLengthToRead = iStream.Length; //獲取下載的文件總大小  
            Response.ContentType = "application/octet-stream";  
            Response.AddHeader("Content-Disposition",  
                "attachment; filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));  
            while (dataLengthToRead > 0 && Response.IsClientConnected)  
            {  
                int lengthRead = iStream.Read(buffer, 0, Convert.ToInt32(ChunkSize)); //讀取的大小  
                Response.OutputStream.Write(buffer, 0, lengthRead);  
                Response.Flush();  
                dataLengthToRead = dataLengthToRead - lengthRead;  
            }  
            Response.Close();  
        }  
    }  
  
    //流方式下載  
    protected void Button4_Click(object sender, EventArgs e)  
    {  
        string fileName = "test.doc";//客戶端保存的文件名  
        string filePath = Server.MapPath("../ReportTemplate/test.doc");//路徑  
  
        //以字符流的形式下載文件  
        FileStream fs = new FileStream(filePath, FileMode.Open);  
        byte[] bytes = new byte[(int)fs.Length];  
        fs.Read(bytes, 0, bytes.Length);  
        fs.Close();  
        Response.ContentType = "application/octet-stream";  
        //通知瀏覽器下載文件而不是打開  
        Response.AddHeader("Content-Disposition", "attachment;  filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));  
        Response.BinaryWrite(bytes);  
        Response.Flush();  
        Response.End();  
    }  
} 

注意:如果直接在aspx.cs上寫以上的代碼,response一定要手動關閉,否則就會把整個頁面的HTML代碼都給下載了。

還有一種方式就是把上面的代碼放入一個一般處理程序中這樣就可以很好的避免下載整個頁面的HTML代碼

代碼如下

using System.Web;
using ECS.Biz.Common.Common;
using ECS.Biz.DEPG1210Ds.ServiceModel;

namespace ECS.Web.Handle
{
    /// <summary>
    /// DownLoad の概要の説明
    /// </summary>
    public class DownLoadHttpHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
          //因為用到了session傳值,所以DownLoadHttpHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState DEPG1210DsSvm l_svmDEPG1210Ds = (DEPG1210DsSvm)context.Session[ConstData.Session.DEPG1210_DEPG1210DsSvm]; string l_strFileName = l_svmDEPG1210Ds.DEPG1210DsCtx.ConferenceInfoTbl.Entities[0].JournalsFileName; byte[] l_bytFileData = l_svmDEPG1210Ds.DEPG1210DsCtx.ConferenceInfoTbl.Entities[0].JournalsContent; //HttpContext.Current.Response.Clear(); l_strFileName = System.Web.HttpUtility.UrlEncode(l_strFileName); HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + l_strFileName); if (l_bytFileData.Length == 0) { l_bytFileData = System.Text.Encoding.Unicode.GetBytes(" "); } HttpContext.Current.Response.BinaryWrite(l_bytFileData); //HttpContext.Current.Response.Flush(); //HttpContext.Current.Response.End(); } public bool IsReusable { get { return false; } } } }

這個的傳值我用的是Session來傳值的所以畫面調用的話就會很簡單了

<asp:LinkButton ID="lbtnAttachFiles" runat="server" href="../Handle/DownLoadHttpHandler.ashx"
                                                        Width="160px" CssClass="ShortNameShow"></asp:LinkButton>

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM