【问题标题】:File not found error with FileStreamResult controller actionFileStreamResult 控制器操作找不到文件错误
【发布时间】:2010-08-26 00:10:53
【问题描述】:

我有一个控制器动作声明如下:

[Authorize(Order = 0, Roles = "Requester,Controller,Installer")]
public FileStreamResult ExportJobCards()

此方法的主体构建 CSV 行的集合,并尝试将它们作为文件返回,如下所示:

using (var sw = new StreamWriter(new MemoryStream()))
{
    foreach (var line in lines)
    {
        sw.WriteLine(line);
    }
    return new FileStreamResult(sw.BaseStream, "text/csv");
}  

当我使用以下操作链接请求此操作时...

Html.ActionLink("Export to Excel", "ExportJobCards")

...导出方法正确执行,即上述代码的lines集合中存在所有必需的CSV数据,但我得到一个File Not Found错误呈现为结尾结果。

编辑: 与汤米的观察一致,我将return 移出using,现在我得到一个文件,但该文件是空的。实际生成文件的新代码,ableit 为空,是:

var sw = new StreamWriter(new MemoryStream());            
foreach (var line in lines)
{
    sw.WriteLine(line);
}
sw.Flush();
return new FileStreamResult(sw.BaseStream, "text/csv");  

【问题讨论】:

  • using语句能否在返回完成前处理掉StringWriter?
  • @Tommy,你为什么不发布你的建议作为答案,以便我接受?
  • 完成了,很高兴它起作用了(很明显)。我不太确定这是之前将其作为答案发布的问题。

标签: asp.net asp.net-mvc


【解决方案1】:

使用您当前的设置,Using 语句会在返回完成之前处理 StringWriter,这会导致 null 引用/找不到文件错误。在退出之前删除 using 语句或将 StringWriter 设置为另一个变量,您应该可以继续摆脱 File Not Found 错误。

现在考虑您的第二个问题,将内存流视为文件流结果,您可能需要将返回更改为此

sw.BaseStream.seek(0, SeekOrigin.Begin)
return new FileStreamResult(sw.BaseStream, "text/csv"); 

当您返回时,指针仍位于流的末尾。

【讨论】:

  • 这两点都对,谢谢。希望我能给你 2 票。
  • 对于任何到达这一点并像我一样询问应该如何处理流的人,请注意 FileStreamResult 在写入文件时会为您处理它。供参考:stackoverflow.com/questions/3084366/…
【解决方案2】:

它会引发该错误,因为您没有为其提供文件流。您想要的是 FileContentResult ,您可以将任意内容传递到其中。此内容需要是您的内容的字节数组,可能最容易:

  1. 使用 stringbuilder 而不是 streamwriter
  2. 从构建器获取字符串
  3. 使用静态方法 System.Text.UnicodeEncoding.Unicode.GetBytes(string) 获取字节数组
  4. 将字节数组提供给 FileContentResult

因为无论如何您都必须编写此代码,所以最简单的方法是创建一个新的 FileStringResult,它继承自可以接收字符串或字符串构建器的基本 FileResult。覆盖 WriteFile(HttpResponseBase response) 以将字符串转换为 byte[] 并将其推送到响应中。看看 MVC 源码中的 FileStreamResult 类,它非常小而且很容易做到。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多