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内容也一起返回到服务器.

  • 相关阅读:
    详解 字符转换流
    详解 编码和解码
    详解 字符流
    详解 序列输入流
    详解 数据输入输出流
    八皇后
    这次我们从底层把线程说清楚
    四数之和递归
    PCB 内网实现《OCR文字识别》实现逻辑
    PCB 线路板人生
  • 原文地址:https://www.cnblogs.com/gates/p/4149301.html
Copyright © 2011-2022 走看看