我有一个ASP.NET MVC 4站点,使用OPEN
XML SDK创建一个excel文件.我只是将超链接指向适当的控制器,它生成OPEN XML excel文档并将流写入响应头并完成.在IE 9和Chrome中,这很好用.使用给定的文件名和正确的内容下载文件.然而,就在最近我将浏览器升级到IE 10,而不是下载文件并在excel中打开我得到的错误无法打开’URI’.当我单击确定它会出现另一个错误:Microsoft Excel无法访问文件’URI’.有几个可能的原因:
我不明白为什么这可以在IE 9和Chrome中工作,而不是在IE 10中.我使用小提琴程序调试了响应头,它具有正确的内容类型和内容长度设置:
内容类型:application / vnd.openxmlformats-officedocument.spreadsheetml.sheet
内容处理:附件;文件名= result.xlsx
内容长度:1232
有什么东西我错过了吗?
代码片段:这一切都是其中的一部分
public override void ExecuteResult(ControllerContext context)
{
...
....
..
extention = "xlsx";
response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
response.AddHeader("Content-Disposition",
String.Format("attachment; filename={0}.{1}", fileName, extention));
response.AddHeader("Content-Length", mem.Length.ToString());
mem.Seek(0, SeekOrigin.Begin); // Go back to the begining.
mem.CopyTo(response.OutputStream);
context.HttpContext.ApplicationInstance.CompleteRequest();
}
最佳答案 作为一种解决方法,
Controller.File
适用于ASP.NET MVC 4和IE 10:
public class DownloadController : Controller
{
public ActionResult GetFile()
{
...
mem.Position = 0;
return File(
mem,
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
"result.xlsx");
}
}
编辑
所以我一直在CodePlex上浏览MVC源代码,发现了一些与你的代码片段不同的实现细节:
>从不设置Content-Length标头
>而不是调用Stream.CopyTo,他们使用一个简单的Stream.Read,Stream.Write循环,缓冲区大小为0x1000
>设置Content-Disposition标头时,它们会检查文件下载名称是否包含UTF-8字符,如果是,则根据RFC 2231对其进行编码.请参阅ContentDispositionUtil.GetHeaderValue
>从不调用context.HttpContext.ApplicationInstance.CompleteRequest()
现在,您可以尝试逐个应用这些更改,并查看哪一个使其适用于IE 10.