ASP.NET四個文件結果之間的差異有四種不同類型的文件的結果:什麼是在ASP.NET MVC
- FileContentResult:發送一個二進制文件到響應的內容。
- FilePathResult:發送一個文件的內容的響應
- FileResult:返回二進制輸出到寫入響應
- FileStreamResult:發送二進制內容到響應通過使用流實例
那些描述是從MSDN採取的,並且除了FileStreamResult的前三個聲音完全相同外。那麼他們之間有什麼區別?
ASP.NET四個文件結果之間的差異有四種不同類型的文件的結果:什麼是在ASP.NET MVC
那些描述是從MSDN採取的,並且除了FileStreamResult的前三個聲音完全相同外。那麼他們之間有什麼區別?
FileResult
是所有其他的抽象基類。
FileContentResult
- 您使用它,當你有一個字節數組,你想退回作爲文件FilePathResult
- 當你有一個磁盤文件,並想回到它的內容(你給一個路徑)FileStreamResult
- 你有流開,你想回到它的文件內容但是,你很少有使用這些類 - 你可以使用的Controller.File
重載一個,讓ASP。網絡mvc爲y做魔術ou
很好的問題......並值得更多的細節。由於有趣的情況,我發現自己在這裏。我們通過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會將此標頭的倍數視爲錯誤。
奇怪的反應......但絕對是一個很好的知道。
只是一個提示,在.NET 4 +中,如果無法輕鬆訪問,可以使用`System.Web.MimeMapping.GetMimeMapping(filename)`來收集MIME類型。 – GONeale 2014-10-30 06:16:45