ASP.NET下载文件(转载)

如何通过ASP.NET来下载文件,这个问题我们经常遇到,把常用的方法总结到一起,学习学习。当我们要让用户下载一个文件,最简单的方式是通过Response.Redirect指令:

Response.Redirect("test.doc")



您可以把上面这行指令放在Button的Click事件当中,当用户点击按钮之后,网页就会被转址到该word档,造成下载的效果。


但是这样的下载有几个问题:


1、无法下载不存在的文件:例如,我们若是想把程序动态(临时)产生的文字,当作一个文件下载的时候(也就是该文件其实原先并不是真的存在,而是动态产生的),就无法下载。


2、无法下载存储于数据库中的文件:这是类似的问题,该文件并没有真的存在,只是被存放在数据库中的某个位置(某笔记录中的某个栏位)的时候,就无法下载。


3、无法下载不存在于Web文件夹中的文件:文件确实存在,但该文件夹并不是可以分享出来的Web文件夹,例如,该文件的位置在C:\winnt,您总不会想要把该文件夹当作Web文件夹吧?这时候,由于您无法使用Redirect指向该位置,所以无法下载。


4、下载文件后,原本的页面将会消失。


典型的状况是,我们要让用户下载一个.txt文件或是.csv格式的Excel文件,但是...


1、这个文件可能是通过ASP.NET程序动态产生的,而不是确实存在于Server端的文件;


2、或是它虽然存在于伺服器端的某个实体位置,但我们并不想暴露这个位置(如果这个位置公开,很可能没有权限的用户也可以在网址栏上输入URL直接取得!!!)


3、或是这个位置并不在网站虚拟路径所在的文件夹中。(例如C:\Windows\System32...)



   //TransmitFile实现下载


    protected void Button1_Click(object sender,
EventArgs e)


    {


        /*


       
微软为Response对象提供了一个新的方法TransmitFile来解决使用Response.BinaryWrite


        下载超过400mb的文件时导致Aspnet_wp.exe进程回收而无法成功下载的问题。


        代码如下:


        */


        Response.ContentType =
"application/x-zip-compressed";


        Response.AddHeader("Content-Disposition",
"attachment;filename=z.zip");


        string filename =
Server.MapPath("DownLoad/z.zip");


        Response.TransmitFile(filename);


    }


    //WriteFile实现下载


    protected void Button2_Click(object sender,
EventArgs e)


    {


        /*


        using System.IO;


        */


        string fileName = "asd.txt";//客户端保存的文件名


        string filePath =
Server.MapPath("DownLoad/aaa.txt");//路径


        FileInfo fileInfo = new
FileInfo(filePath);


        Response.Clear();


        Response.ClearContent();


        Response.ClearHeaders();


        Response.AddHeader("Content-Disposition",
"attachment;filename=" + fileName);


        Response.AddHeader("Content-Length",
fileInfo.Length.ToString());


        Response.AddHeader("Content-Transfer-Encoding",
"binary");


        Response.ContentType =
"application/octet-stream";


        Response.ContentEncoding =
System.Text.Encoding.GetEncoding("gb2312");


       
Response.WriteFile(fileInfo.FullName);


        Response.Flush();


        Response.End();


    }


    //WriteFile分块下载


    protected void Button3_Click(object sender,
EventArgs e)


    {


        string fileName = "aaa.txt";//客户端保存的文件名


        string filePath =
Server.MapPath("DownLoad/aaa.txt");//路径


        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));


            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 = "aaa.txt";//客户端保存的文件名


        string filePath =
Server.MapPath("DownLoad/aaa.txt");//路径


        //以字符流的形式下载文件


        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();


    }


//----------------------------------------------------------



public void DownloadFile( System.Web.UI.Page
WebForm,String FileNameWhenUserDownload ,String FileBody )


{


  WebForm.Response.ClearHeaders();


  WebForm.Response.Clear();


  WebForm.Response.Expires = 0;


  WebForm.Response.Buffer = true;


  WebForm.Response.AddHeader("Accept-Language",
"zh-tw");


  //'文件名称


  WebForm.Response.AddHeader("content-disposition",
"attachment;
filename='"+System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload,
System.Text.Encoding.UTF8)+"'");


  WebForm.Response.ContentType =
"Application/octet-stream";


  //'文件内容


  WebForm.Response.Write(FileBody);//-----------


    WebForm.Response.End();


}


//上面这段代码是下载一个动态产生的文本文件,若这个文件已经存在于服务器端的实体路径,则可以通过下面的函数:


public void DownloadFileByFilePath( System.Web.UI.Page
WebForm,String FileNameWhenUserDownload ,String FilePath )


{


  WebForm.Response.ClearHeaders();


  WebForm.Response.Clear();


  WebForm.Response.Expires = 0;


    WebForm.Response.Buffer = true;


  WebForm.Response.AddHeader("Accept-Language",
"zh-tw");


  //文件名称


  WebForm.Response.AddHeader("content-disposition",
"attachment; filename='" +
System.Web.HttpUtility.UrlEncode(FileNameWhenUserDownload,
System.Text.Encoding.UTF8) +"'" );


  WebForm.Response.ContentType =
"Application/octet-stream";


  //文件内容


  WebForm.Response.Write(System.IO.File.ReadAllBytes(FilePath));//---------


  WebForm.Response.End();

原文地址:https://www.cnblogs.com/johnwonder/p/2099816.html