在MVC 2中将流作为附件发送到浏览器

时间:2012-01-31 12:11:13

标签: c# asp.net-mvc-2

我正在尝试在MVC 2中实现Open XML Excel电子表格的文件下载链接。如果我直接写入Response,它的工作原理如下......

var data = MooseMartAdoManager.ExecuteSet("Report.StagAllCasesFullDetail");
         var str = ExcelExportManager.GenerateSpreadsheet(data) as MemoryStream;
         Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
         Response.AddHeader(
            "content-disposition",
            "attachment;filename=StagFullDetail" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + ".xlsx");
         str.WriteTo(Response.OutputStream);

但是,由于我花了很多时间来抽象出关于如何收集数据以及为代码重用和IOC创建报告的所有逻辑,所以能够弄清楚为什么这个剂量工作会很好...

  public FileStreamResult GetExcelDetailExport()
  {
     var data = MooseMartAdoManager.ExecuteSet("Report.StagAllCasesFullDetail");
     var file = ExcelExportManager.GenerateSpreadsheet(data);

     return File(file, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
        "StagFullDetail" + DateTime.Now.ToString("yyyy-MM-dd-hh-mm-ss") + ".xlsx");
  }

我得到的只是txt格式的零字节文件。

那么处理这个问题的“正确”MVC方法是什么?

1 个答案:

答案 0 :(得分:2)

您可能遇到此问题的一个原因是此处的file位于流的末尾:

var file = ExcelExportManager.GenerateSpreadsheet(data); // it is at the end of stream

我建议你设置为0:

file.Position = 0;

您之前的代码有效,因为您使用忽略当前位置的str.WriteTo