需求:点击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, , (int)lngFileSize)) > )
{
outStream.Write(bytBuffer, , 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#实现文件下载的更多相关文章

  1. Android 浏览器 —— 使用 WebView 实现文件下载

    对当前的WebView设置下载监听 mCurrentWebView.setDownloadListener(new DownloadListener() { @Override public void ...

  2. C# 文件下载 : WinINet

    在 C# 中,除了 WebClient 我们还可以使用一组 WindowsAPI 来完成下载任务.这就是 Windows Internet,简称 WinINet.本文通过一个 demo 来介绍 Win ...

  3. ASP.net MVC 文件下载的几种方法(欢迎讨论)

    在ASP.net MVC 中有几种下载文件的方法 前提:要下载的文件必须是在服务器目录中的,至于不在web项目server目录中的文件下载我不知道,但是还挺想了解的. 第一种:最简单的超链接方法,&l ...

  4. 让IIS7.0.0.0支持 .iso .7z .torrent .apk等文件下载的设置方法

    IIS默认支持哪些MIME类型呢,我们可以这样查看:打开IIS管理器(计算机--管理--服务和应用程序--Internet信息服务(IIS)管理器:或者Win+R,输入inetmgr,Enter),在 ...

  5. Android中使用AsyncTask实现文件下载以及进度更新提示

    Android提供了一个工具类:AsyncTask,它使创建需要与用户界面交互的长时间运行的任务变得更简单.相对Handler来说AsyncTask更轻量级一些,适用于简单的异步处理,不需要借助线程和 ...

  6. 利用Tomcat内置的servlet实现文件下载功能

    起因 最近博客所在的VPS挂了又要重装系统,又要重装各种软件. 以前我也经常更换VPS,每次更换都是各种坑爹事情..比如要下载java.下载tomcat.下载mysql..........以前每次我都 ...

  7. 多个文件下载打包生成zip格式下载

    这个多个文件下载生成zip格式必须先引用一个ICSharpCode.SharpZipLib.dll. 代码如下  //将多个文件打包成压缩文件zip格式下载         protected voi ...

  8. .net一般处理程序(httphandler)实现文件下载功能

    Handler文件代码如下: public class MDMExporterWeb : IHttpHandler { public void ProcessRequest(HttpContext c ...

  9. asp.net 文件下载(txt,rar,pdf,word,excel,ppt)

    aspx 文件下载说起来一点都不难,但是在做的过程中还是遇到了一些小小的问题,就是因为这些小小的问题,导致解决起来实在是太难了,其中一个就是Response.End();导致下载文件出现线程终止的情况 ...

  10. JavaScript多文件下载

    对于文件的下载,可以说是一个十分常见的话题,前端的很多项目中都会有这样的需求,比如 highChart 统计图的导出,在线图片编辑中的图片保存,在线代码编辑的代码导出等等.而很多时候,我们只给了一个链 ...

随机推荐

  1. MVC&WebForm对照学习:文件上传(以图片为例)

    原文  http://www.tuicool.com/articles/myM7fe 主题 HTMLMVC模式Asp.net 博客园::首页::  ::  ::  ::管理 5 Posts :: 0 ...

  2. Codeforces Round #280 (Div. 2) A B C 暴力 水 贪心

    A. Vanya and Cubes time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  3. C语言学习笔记 -冒泡排序

    //冒泡排序 void main(){ , , , , }; ]); ; i<max - ; i++) { for (int j = i; j<max; j++) { if (a[i]&g ...

  4. javabean实现serializable有什么用?为什么数据库持久就Bean实现这个接口?

    Java的"对象序列化"能让你将一个实现了Serializable接口的对象转换成一组byte,这样日后要用这个对象时候,你就能把这些byte数据恢复出来,并据此重新构建那个对象了 ...

  5. 26 个 jQuery使用技巧

    1. 禁用右键点击(Disable right-click) $(document).ready(function(){ $(document).bind("contextmenu" ...

  6. vb6异步ADO操作

    Private withevents M_Conn as adodb.connection Private CmdFinished as boolean sub somesub AdoCmd.Exec ...

  7. redis模块

    http://www.cnblogs.com/melonjiang/p/5342505.html http://www.django-china.cn/topic/1054/ 1.连接方式 redis ...

  8. Visual Studio 文件没发布出来

    解决办法是选择文件打开属性窗口找到生成操作,选项选择"内容",重新发布,OK,问题解决.

  9. 【转】关于B/S架构应用程序的权限设置分析和总结

    来自:http://www.cnblogs.com/zhouxunyu/p/3790122.html 分析:不同的用户登录到系统后赋予不同的操作权限,而用户存在于数据库中,标识用户权限的字段也保存在数 ...

  10. OpenJudge计算概论-配对碱基链

    /*===================================== 配对碱基链 总时间限制: 1000ms 内存限制: 65536kB 描述 脱氧核糖核酸(DNA)由两条互补的碱基链以双螺 ...