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

【转】c#实现文件下载

上一篇:C#程序设计总结


下一篇:C# 扩展类