2015-12-28 145 views
10

我在編輯一些代碼,並且有一種方法返回FileContentResult類型。我從服務中獲得流,因此對於我來說,將返回類型更改爲FileStreamResult會更方便。FileContentResult和FileStreamResult之間的區別

我應該將流轉換爲數組來返回FileContentResult

或者我能否安全地改變返回類型?

回答

16

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

  • FileContentResult - 使用它,當你有一個字節數組,你會 想回作爲文件
  • FileStreamResult - 你有流開,你想回到它的 內容爲文件
12

FileStreamResultFileContentResult繼承自FileResult,它繼承自ActionResult。所以,你可以從具有ActionResult返回類型

的方法返回任何一個類型的。如果你已經有了一個流,可以使用FileStreamResult構造函數返回一個FileResult

public ActionResult Download() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var fileStream = new FileStream(f,FileMode.Open,FileAccess.Read); 
    return new FileStreamResult(fileStream, MimeMapping.GetMimeMapping(f)); 
} 

如果你已經有了一個字節arrray,您可以使用FileContentResult構造函數返回一個FileResult

public ActionResult Download() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var bytes = System.IO.File.ReadAllBytes(f); 
    return new FileContentResult(bytes, MimeMapping.GetMimeMapping(f)); 
} 

Controller.File方法具有重載其中它可以是一個字節數組或一個流

public ActionResult Download() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var bytes = System.IO.File.ReadAllBytes(f); 
    return File(bytes, MimeMapping.GetMimeMapping(f)); 
} 
public ActionResult Download2() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read); 
    return File(fileStream, MimeMapping.GetMimeMapping(f)); 
} 

如果瀏覽器以顯示響應的內容類型的支持,該響應將被顯示在瀏覽器中。例如,對於上面的代碼,它將在瀏覽器中顯示pdf內容。

File方法存在另一個過載,它採用瀏覽器的保存/下載對話框將使用的下載文件名,以便用戶可以將其保存到本地計算機和/或打開。

public ActionResult Download4() 
{ 
    var f = Server.MapPath("~/Content/mypdf.pdf"); 
    var fileStream = new FileStream(f, FileMode.Open, FileAccess.Read); 
    return File(fileStream, MimeMapping.GetMimeMapping(f),"MyfileNiceFileName.pdf"); 
} 

這樣,用戶將從瀏覽器獲得下載提示。

+3

客戶端無法區分差異。客戶端找不到.NET類用於向瀏覽器發送字節。 – usr

+0

如果我需要將文件顯示到網頁的特定部分,該怎麼辦?目前文件流將呈現整個網頁。我們可以針對頁面中的一個小區域嗎? – Unbreakable

+0

我想你可以嘗試加載一個iframe。從來沒有嘗試過,雖然 – Shyju