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

本文关键字:浏览器 MVC | 更新日期: 2023-09-27 18:22:11

我正在尝试在MVC 2中实现OpenXMLExcel电子表格的文件下载链接。如果我直接写信给回复,它的工作原理如下。。。

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方式是什么呢?

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

出现此问题的一个原因是这里的file位于流的末尾:

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

我建议你设置为0:

file.Position = 0;

由于使用了忽略当前位置的str.WriteTo,因此您以前的代码可以正常工作。