2012-05-28 68 views
1

簡短版本: 我有一個返回FileResult的第三方MVC擴展。我希望能夠在將文件返回給客戶端之前處理該文件。我怎樣才能做到這一點?ASP.NET MVC - 如何從FileResult獲取文件?

如果你有興趣在無聊的細節,請閱讀下文:

我使用的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));  
     } 

回答

3

你說你使用的第三方MVC擴展返回FileResult,你想訪問包裝在結果中的文件細節。

如果你看到FileResult,它是一個抽象類,我只知道有三個內置的實現MVC中可用(我不知道別人):FileContentResultFileStreamResultFilePathResult

所有這些類都提供公共屬性來訪問文件的詳細信息。例如。 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並覆蓋WriteFile方法。

+0

我檢查了具體的類型,不幸的是他們自己的XtraReportsFileResult :( – kubal5003

+0

我也發現它從FileStreamResult的Iheriths:D – kubal5003

3

的FileResult可能寫入文件內容響應流。您可以使用過濾器來使用標準的ASP.NET響應流。看到這個古老的文章詳細內容:

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

另外,您可以創建自己的ActionResult,使用自定義的HttpContext用假響應流中,這是在那裏你會做你的轉換調用的DevExpress FileResult。

+0

使用普通的老式響應過濾器可能是目前唯一的選擇。我不喜歡這個解決方案是我需要緩存整個響應以使其工作。也許我可以找到rtf到PDF格式轉換工作流..無論如何,非常感謝你。 – kubal5003

相關問題