ASP.NET MVC - 如何从FileResult获取文件?

时间:2012-05-28 08:48:31

标签: asp.net-mvc

简短版本: 我有一个返回FileResult的第三方MVC扩展。我希望能够在将文件返回给客户端之前处理该文件。我怎么能这样做?

如果您对枯燥的细节感兴趣,请阅读以下内容:

我正在使用Devexpress XtraReports进行报告。问题是它的PDF导出很糟糕,但RTF很好用。我想创建动作和结果过滤器,它会欺骗DevExpress生成rtf而不是pdf(完成),并使用其他第三方库将rtf转换为pdf。唯一的问题是我需要从FileResult获取rtf文件并返回我自己的FileResult和转换后的内容。

//编辑: 现在的代码如下:

        public virtual ActionResult ReportExport(TParameters parameters)
        {
            return DevExpress.Web.Mvc.ReportViewerExtension.ExportTo(this.GetReport(parameters));    
        }

2 个答案:

答案 0 :(得分:3)

FileResult可能会将文件内容写入响应流。您可以使用筛选器使用标准ASP.NET响应流。有关详细信息,请参阅此古代文章:

http://www.4guysfromrolla.com/articles/120308-1.aspx

或者,您可以创建自己的ActionResult,使用带有假响应流的自定义HttpContext来调用DevExpress FileResult,这是您进行转换的地方。

答案 1 :(得分:3)

您说您正在使用返回FileResult的第三方MVC扩展程序,并且您希望访问包含在结果中的文件详细信息。

如果你看到FileResult,它是一个抽象类,我只知道MVC中有三个内置实现(我不知道其他的):FileContentResult,{ {1}}和FileStreamResult

所有这些类都提供公共属性来访问文件的详细信息。对于前者FilePathResult包含一个名为FileContentResult的公共属性,它将文件内容作为字节数组返回。

第三方扩展程序可以返回内置类型的任何FileContents实现,也可以返回错误(如果您无法访问这些类型)自己的类型。您可以检查返回的FileResult实例的类型并相应地转换它以访问文件详细信息。

FileResult

如果你想让事情可以重复使用,你可以实现一个自定义文件结果,该结果采用构造函数中扩展返回的var fileResult = ... returned by the MVC extension if(fileResult is FileContentResult) { var fileContentResult = fileResult as FileContentResult; var fileContent = fileContentResult.FileContents; // process the file } else if(fileResult is FileStreamResult) { var fileStreamResult = fileResult as FileStreamResult; var fileStream = fileStreamResult .Stream; //... } else if(fileResult is FilePathResult) // this result only contains the path // of the file name { //... } 并覆盖FileResult方法。