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