简短版本: 我有一个返回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));
}
答案 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
方法。