2009-07-27 48 views
126

ASP.NET四個文件結果之間的差異有四種不同類型的文件的結果:什麼是在ASP.NET MVC

  • FileContentResult:發送一個二進制文件到響應的內容。
  • FilePathResult:發送一個文件的內容的響應
  • FileResult:返回二進制輸出到寫入響應
  • FileStreamResult:發送二進制內容到響應通過使用流實例

那些描述是從MSDN採取的,並且除了FileStreamResult的前三個聲音完全相同外。那麼他們之間有什麼區別?

回答

162

FileResult是所有其他的抽象基類。

  • FileContentResult - 您使用它,當你有一個字節數組,你想退回作爲文件
  • FilePathResult - 當你有一個磁盤文件,並想回到它的內容(你給一個路徑)
  • FileStreamResult - 你有流開,你想回到它的文件內容

但是,你很少有使用這些類 - 你可以使用的Controller.File重載一個,讓ASP。網絡mvc爲y做魔術ou

23

很好的問題......並值得更多的細節。由於有趣的情況,我發現自己在這裏。我們通過MVC3/C#環境提供了一些pdf附件。我們的代碼已經發布,我們開始從我們的客戶那裏得到一些迴應,他們的下載在使用Chrome時出現了奇怪的行爲,並且文件類型被轉換爲'pdf-,attachment.pdf-,attachment'。是的......你明白了......整個事情。因此,可以將其重寫爲'pdf',並且該文件仍然可以保存完好,但是一團糟!

所以,來形容最初的情況,我們設置「內容處置」標頭,然後返回一個FileContentResult ...

var cd = new System.Net.Mime.ContentDisposition 
      { 
       FileName = result.Attachment.FileName, 
       Inline = false 
      }; 
      Response.AppendHeader("Content-Disposition", cd.ToString()); 

return File(result.Attachment.Data, MimeExtensionHelper.GetMimeType(result.Attachment.FileName), result.Attachment.FileName); 

好象不錯。在IE中工作得很好。所以,我做了一些研究,並試圖實現FileStreamResult代替(保持內容處置制定者):

MemoryStream dataStream = new MemoryStream(); 
dataStream.Write(result.Attachment.Data, 0, result.Attachment.Data.Length); 
dataStream.Position = 0; 
return new FileStreamResult(dataStream, MimeExtensionHelper.GetMimeType(result.Attachment.FileName)); 

它解決了該問題在Chrome!嗯......但爲什麼在這種情況下,我應該把我的完美的字節數組和流,然後通過這個返回它來讓文件名正常工作?

然後來了提琴手。

使用FileContentResult,我在頭文件中獲得了2個Content-Dispositions。 使用FileStreamResult,我得到1.

FileContentResult在提供文件名時附加Content-Disposition標頭,Chrome會將此標頭的倍數視爲錯誤。

奇怪的反應......但絕對是一個很好的知道。

+3

只是一個提示,在.NET 4 +中,如果無法輕鬆訪問,可以使用`System.Web.MimeMapping.GetMimeMapping(filename)`來收集MIME類型。 – GONeale 2014-10-30 06:16:45