gpt4 book ai didi

c# - ASP.NET MVC 无法流式传输文件

转载 作者:行者123 更新时间:2023-11-30 12:27:38 25 4
gpt4 key购买 nike

我有一个 ASP.NET MVC 4 站点,它使用 OPEN XML SDK 创建一个 excel 文件。我只是将超链接指向正确的 Controller ,它会生成 OPEN XML excel 文档并将流写入响应 header 并完成。在 IE 9 和 Chrome 中这工作正常。使用给定的文件名和正确的内容下载文件。然而,就在最近我将浏览器升级到 IE 10,现在我没有下载文件并在 excel 中打开,而是收到了 could not open 'URI' 的错误。当我单击“确定”时,它会出现另一个错误:Microsoft Excel 无法访问文件“URI”。有几种可能的原因:

我不明白为什么这会在 IE 9 和 chrome 而不是在 IE 10 中工作。我用 fiddler 调试了响应 header ,它具有正确的内容类型和内容长度集:

内容类型:application/vnd.openxmlformats-officedocument.spreadsheetml.sheet

内容配置:附件; filename=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 header 从未设置

  • 他们没有调用 Stream.CopyTo,而是使用一个简单的 Stream.ReadStream.Write 循环,缓冲区大小为0x1000

  • 当设置 Content-Disposition header 时,它们会检查文件下载名称是否包含 UTF-8 字符,如果是,则根据 RFC 2231 对其进行编码。参见 ContentDispositionUtil.GetHeaderValue

  • context.HttpContext.ApplicationInstance.CompleteRequest() 从未被调用

现在,您可以尝试一项一项地应用这些更改,看看哪项使其适用于 IE 10。

关于c# - ASP.NET MVC 无法流式传输文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24785150/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com