ASP.NET MVC无法传输文件

时间:2014-07-16 15:46:57

标签: c# asp.net-mvc-4 internet-explorer internet-explorer-10 openxml-sdk

我有一个使用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();
}

3 个答案:

答案 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.CopyToStream.Read循环,缓冲区大小为Stream.Write

  • ,而不是调用0x1000
  • 设置Content-Disposition标头时,会检查文件下载名称是否包含UTF-8字符,如果是,请根据RFC 2231对其进行编码。请参阅ContentDispositionUtil.GetHeaderValue

  • 永远不会调用context.HttpContext.ApplicationInstance.CompleteRequest()

现在,您可以尝试逐个应用这些更改,并查看哪个更改可以使用IE 10。

答案 1 :(得分:0)

我猜这是一个IE10错误。但也许你仍然可以解决它。

基于this post和其他一些人。 请检查:

  1. 完整的URI和Content Disposition标题的文件名都不包含特殊符号,并且它们的长度小于105.例如,只需使用常规的A-Za-z0-9符号。

  2. 尝试添加“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");

感谢