<%
@ Page Language
=
"
C#
"
AutoEventWireup
=
"
true
"
CodeFile
=
"
test.aspx.cs
"
Inherits
=
"
test
"
%>
test.aspx.cs:
protected
void
Page_Load(
object
sender, EventArgs e)
{
string fileName = " SalesOrder_090730120254.xls " ;
string path = " D:\\ " + fileName;
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.ContentType = " application/vnd.ms-excel " ;
Response.AddHeader( " Content-Disposition " , " attachment;filename=\ "" +fileName+ " \ "" );
Response.TransmitFile(path);
}
{
string fileName = " SalesOrder_090730120254.xls " ;
string path = " D:\\ " + fileName;
Response.Cache.SetCacheability(HttpCacheability.Private);
Response.ContentType = " application/vnd.ms-excel " ;
Response.AddHeader( " Content-Disposition " , " attachment;filename=\ "" +fileName+ " \ "" );
Response.TransmitFile(path);
}
问题汇总:
1. IE6缓存问题
上面代码如果将缓存设置改为HttpCacheability.NoCache,IE7、FF可以下载,但IE6会报错“Internet Explorer could not download "file name" from "server url".”,同在IE6的机器上,使用IE内核的360浏览器可以下载
原因是缓存设置为NoCache或者立即过期时,IE6缓存清除的太快,在弹出另存为的下载对话框后立即将文件删除掉了,用户点击保存按钮时文件已经不存在
某些情况下,将Response.Buffer设置为true也可能导致这个错误
直接将链接地址指向服务器端文件的下载方式,IIS使用的帐号(匿名帐号或集成认证帐号)没有访问下载文件的NT权限时也可能报无法下载的错误,这里提供的下载方式不存在这个问题
在IE6的机器上用Fiddler监控360浏览器下载情况,发现360浏览器会多出一次返回文件的请求,问题清楚了,360在保存文件时发现缓存中文件已经不存在,重新从服务器请求文件。将360设置为使用IE下载工具同样无法下载
2. 文件名的问题
content-disposition中给出的文件名包含中文时,需要使用Server.UrlEncode(fileName)编码文件名,否则客户端看到的是乱码。但使用UrlEncode编码后,IE7正确显示文件名,FF不能正确解码出中文文件名
IE6总是显示aspx页面的名字,上面例子IE6的下载文件名是test.xls,没有找到解决方法
因此文件名最好用字母、数字命名
3. 执行下载页面后没有任何反映
一般可能是被杀毒、防火墙软件拦截,关闭杀毒软件再试(有些杀毒软件关闭网页监控之类的功能即可)