从MemoryStream返回时,ASP.net MVC ActionResult会破坏excel文件

时间:2012-01-31 19:00:43

标签: asp.net-mvc-3 excel memorystream

我在Controller中有以下操作

public ActionResult DownloadExcel()
        {
            //create and populate Excel file here
            C1XLBook testBook = new C1XLBook(); 
            //populate it here

            MemoryStream ms = new MemoryStream();
            testBook.Save(ms, FileFormat.Biff8);

            return File(ms, "application/ms-excel", "test-file.xls");           
        }

打开文件时,我收到Excel消息,指出该文件与扩展名不匹配,文件打开已损坏。

如果我将文件保存在硬盘驱动器上并从那里返回,一切都很好:

return base.File(@"C:\LOGS\test-file.xls", "application/ms-excel", "test-excel.xls");

我最初认为Save函数在将其保存到MemoryStream时会破坏它,所以我保存并重新加载它并且很好地传回给用户 - 当保存在硬盘驱动器上并从那里返回时,而不是来自MemoryStream

有什么想法吗?我不太喜欢将文件保存在硬盘上....此外我应该能够将它保存到MemoryStream并从那里返回它?

我有一个预感,也许MemoryStream不应该用于返回MVC中的文件,因为每个请求都是隔离的?

1 个答案:

答案 0 :(得分:5)

在将结果传递给结果之前,您可能需要回滚内存流(设置ms.Position = 0;)吗?在致电Save之后,其位置将在结束时,而不是开头。