使用内容处理附件和非常长的文件名时,无法从IE打开文件

时间:2014-08-26 11:25:01

标签: asp.net internet-explorer attachment content-disposition

我使用非常简单的代码从ASP .NET Web应用程序下载文件。当文件名长度为134个符号或更多时,问题出在Internet Explorer中。将显示标准对话框("是否要从localhost打开或保存123456789012345678901234567890123456 .... pdf?")。但是当点击"打开"按钮没有任何反应文件名长度较短时没有问题,即133。

我的代码:

string fileName = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.pdf";
byte[] fileData = File.ReadAllBytes(Server.MapPath("~/document.pdf"));           

Response.Clear();
Response.ContentType = "application/pdf";
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
Response.OutputStream.Write(fileData, 0, fileData.Length);
Response.Flush();
Response.End();

1 个答案:

答案 0 :(得分:2)

Chrome的智能足以在完整路径超过251个字符时截断文件名。在Windows上,Chrome默认保存为C:\users\<username>\Downloads,这样可以启用更大的文件。

IE 11方法只是跳过打开 / 保存点击,并使取消成为唯一有效的选择,而不通知用户原因。 IE会阻止更长的文件名,因为它会保存到已经很长的路径C:\Users\<username>\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.IE5\XXXXXXXX

方法#1:服务器端截断

如果您可以控制HTTP响应中的附件文件名,并且客户端是IE,则应将附件文件名截断为某些 MAX #chars 会计默认IE保存位置)。

const int MaxFilenameLength = 140;
string fileName = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890.pdf";
bool isIEBrowser = Request.Browser.Browser == "IE" || Request.Browser.Browser == "InternetExplorer";
if (fileName.Length > MaxFilenameLength && isIEBrowser)
    fileName = fileName.Substring(0, MaxFilenameLength); 
\\...
Response.AppendHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
\\...

方法#2:客户端默认保存路径

如果您无法控制服务器,则需要将IE中的默认保存位置更改为更短的路径,可能使用Chrome使用的内容 - &gt; C:\users\<username>\Downloads。转到IE Internet选项 - &gt;设置 - &gt;移动文件夹...

enter image description here

MS IE团队需要修复此错误,因为用户正在猜测该做什么。对我来说,这是一个客户端( IE 11 )问题。