zoukankan      html  css  js  c++  java
  • 【转】c#实现文件下载

    需求:点击SAVE,去ajax去后台下载文件,完成后出现保存对话框,然后直接下载.

    解决方案:下载完成后用JS转到向到另一个页面,在这页面Page_Load里用C#Response对象直接下载.

    下载实现代码

     private void DownFile()
       {
          try
          {
             long lngFileSize;
             byte[] bytBuffer;
             int iReading;
             string sFileName = Server.MapPath("TextFile.txt");
             Stream outStream = Response.OutputStream;//get output stream
    
             //set htttp header
             Response.ContentType = "application/Zip";
             Response.AppendHeader("Connection", "close");
             Response.AppendHeader("Content-Disposition", "  attachment;  filename  =  ItemMarc.txt");//default file name when download
             FileStream fStream = new FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Read);
             lngFileSize = fStream.Length;
             bytBuffer = new byte[(int)lngFileSize];
             while ((iReading = fStream.Read(bytBuffer, 0, (int)lngFileSize)) > 0)
             {
                outStream.Write(bytBuffer, 0, iReading);
             }
             fStream.Close();
             outStream.Close();
             Response.End();
          }
          catch (Exception ex)
          {
             throw ex;
          }
    
          
       }

    解释:1.Response.ContentType = "application/Zip";

    Content-Type是返回消息中非常重要的内容,它标识出这个返回内容的类型,其值为“主类型/子类型”的格式,例如最常见的就是text /html,它的意思是说返回的内容是文本类型,这个文本又是HTML格式的。原则上浏览器会根据Content-Type来决定如何显示返回的消息体内 容。常见的内容类型有:
    text/html HTML文本
    image/jpeg JPG图片
    image/gif GIF图片
    application/xml XML文档
    audio/x-mpegurl MP3文件列表,如果安装了Winamp,则可以直接把它当面M3U文件来打开

    2.Response.AppendHeader("Connection", "close");

    在http1.1中request和reponse header中都有可能出现一个connection的头,此header的含义是当client和server通信时对于长链接如何进行处理。
       在http1.1中,client和server都是默认对方支持长链接的, 如果client使用http1.1协议,但又不希望使用长链接,则需要在header中指明connection的值为close;如果server方 也不想支持长链接,则在response中也需要明确说明connection的值为close.
        不论request还是response的header中包含了值为close的connection,都表明当前正在使用的tcp链接在当天请求处理完毕后会被断掉。以后client再进行新的请求时就必须创建新的tcp链接了。

    3. Response.AppendHeader("Content-Disposition", "  attachment;  filename  =  ItemMarc.txt");

    Content-Disposition:如果用AddHeader的方法在HTTP消息头中加入Content-Disposition段,并指定其值为“attachment”,那么无论这个文件是何类型,浏览器都会提示我们下载此文件,因为此时它认为后面的消息体是一个“附件”,不需要由浏览器来处理了。通过AddHeader函数可以为HTTP消息头加入我们自定义的内容。使用这种方法可以强制让浏览器提示下载文件,即使这个文件是我们已知的类型,基于 是HTML网页。如果想要让用户下载时提示一个默认的文件名,只需要在前面一句话后加上“filename=文件名”即可。

    如果把Content-Type和Content-Disposition结合在一起使用会怎么样呢?
    打开一个网页时,浏览器会首先看是否有Content-Disposition: attachment这一项,如果有,无论Content-Type的值是什么,都会提示文件下载。
    如果指定了filename,就会提示默认的文件名为此文件名。

    4.Response.End();将缓存输出到客户端,实际现象,如果没有这一句,那么会将默认的所有HTML内容也一起返回到服务器.

  • 相关阅读:
    vim复制
    嵌入式Linux学习(二)
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1042 乒乓球
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1071 潜伏者
    (Java实现) 洛谷 P1025 数的划分
    (Java实现)洛谷 P1093 奖学金
    (Java实现)洛谷 P1093 奖学金
    Java实现 洛谷 P1064 金明的预算方案
  • 原文地址:https://www.cnblogs.com/gates/p/4149301.html
Copyright © 2011-2022 走看看