我有一个使用OPEN XML SDK
创建excel文件的ASP.NET MVC 4站点。我只是将超链接指向适当的控制器,它生成OPEN XML excel文档并将流写入响应头并完成。在IE 9和Chrome中,这很好用。使用给定的文件名和正确的内容下载文件。然而,就在最近我将浏览器升级到IE 10,而不是下载文件并在excel中打开我得到could not open 'URI'
的错误。当我单击确定时,它会出现另一个错误:Microsoft Excel cannot access the file 'URI'. There are several possible reasons:
我不明白为什么这会在IE 9和Chrome中运行,而不是在IE 10中。我使用小提琴程序调试了响应标头,它具有正确的内容类型和内容长度设置:
Content Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
Content Disposition: attachment; filename=result.xlsx
Content length: 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();
}
答案 0 :(得分:2)
作为一种解决方法,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。
答案 1 :(得分:0)
我猜这是一个IE10错误。但也许你仍然可以解决它。
基于this post和其他一些人。 请检查:
完整的URI和Content Disposition
标题的文件名都不包含特殊符号,并且它们的长度小于105.例如,只需使用常规的A-Za-z0-9符号。
尝试添加“X-UA兼容”HTTP标头,其值为“IE = 9”。
答案 2 :(得分:0)
尝试以下MIME类型: - 旧版本: -
Response.ContentType = "application/vnd.ms-excel";
Response.AppendHeader("content-disposition", "attachment; filename=myfile.xls");
2007年的: -
Response.ContentType = "application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
Response.AppendHeader("content-disposition", "attachment; filename=result.xlsx");
您需要在Excel中打开的csv文件是: -
Response.AddHeader "Content-Disposition", "Attachment;Filename=myfile.csv"
最后你可以尝试: -
Response.ContentType = "application/octet-stream";
Response.AppendHeader("content-disposition", "attachment; filename=result.xlsx");
感谢