Отправить поток в браузер в виде вложения в MVC 2 - PullRequest
0 голосов
/ 31 января 2012

Я пытаюсь реализовать ссылку на скачивание файла для электронной таблицы Open XML Excel в MVC 2. Если я пишу напрямую в ответ, он работает следующим образом ...

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 Ответ

2 голосов
/ 31 января 2012

Одной из причин возникновения этой проблемы является то, что file здесь находится в конце потока:

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

Я предлагаю вам установить 0:

file.Position = 0;

Ваш предыдущий код работает, так как вы используете str.WriteTo, который игнорирует текущую позицию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...