zoukankan      html  css  js  c++  java
  • 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();

  • 相关阅读:
    SQLSERVER 的表分区(水平) 操作记录2
    GraphQl in ASP.NET Core
    初始认知学习 .net core 逐步加深
    C# 关于使用JavaScriptSerializer 序列化与返序列化的操作
    Nginx、IIS 相关命令
    SqlServer:查询指定表所有外键关联表信息
    centos 重启宝塔命令
    c# 根据日志中的方法信息,反射再次执行相关方法
    jackson 下载地址记录
    【设计模式】六大原则
  • 原文地址:https://www.cnblogs.com/johnwonder/p/2099816.html
Copyright © 2011-2022 走看看