2015-12-28 9 views
10

Ich bearbeite Code und es gibt eine Methode, die FileContentResult Typ zurückgibt. Ich erhalte einen Stream vom Dienst, daher wäre es für mich bequemer, den zurückgegebenen Typ in FileStreamResult zu ändern.Unterschied zwischen FileContentResult und FileStreamResult

Sollte ich Stream in ein Array konvertieren, um FileContentResult zurückzugeben?

Oder kann ich den zurückkehrenden Typ einfach ändern?

Antwort

16

FileResult ist eine abstrakte Basisklasse für alle anderen.

  • FileContentResult - es verwenden, wenn Sie ein Byte-Array haben würden Sie gerne als Datei zurück
  • FileStreamResult - Sie haben einen Strom offen, Sie es Inhalt als Datei
zurückkehren möchten
12

Sowohl FileStreamResult als auch FileContentResult erben von FileResult, die von ActionResult erbt. So können Sie entweder ein Typ aus einer Methode zurück, die ActionResult als Rückgabetyp hat

Wenn Sie bereits ein Strom haben, können Sie FileStreamResult Konstruktor verwenden, um eine 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)); 
} 

zurückzukehren Wenn Sie bereits ein Byte arrray, können Sie FileContentResult Konstruktor zurückgeben 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)); 
} 
verwenden

Controller.File Die Methode hat Überlastungen, die entweder einen Byte-Array oder einen Strom

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)); 
} 

nimmt Wenn der Browser den Träger den Inhaltstyp der Antwort angezeigt wird, wird die Reaktion im Browser angezeigt werden. Für den obigen Code wird beispielsweise der PDF-Inhalt im Browser angezeigt.

Es gibt eine weitere Überladung der Methode File, die den Namen der heruntergeladenen Datei annimmt, den der Speichern/Herunterladen-Dialog des Browsers verwendet, damit der Benutzer seinen lokalen Computer speichern und/oder öffnen kann.

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"); 
} 

Mit diesem erhalten Benutzer eine Download-Eingabeaufforderung aus dem Browser.

+3

Der Client kann den Unterschied nicht erkennen. Der Client kann nicht herausfinden, welche .NET-Klasse zum Senden von Bytes an den Browser verwendet wurde. – usr

+0

Was passiert, wenn ich die Datei einem bestimmten Abschnitt der Webseite anzeigen muss? Derzeit wird Filestream die gesamte Webseite rendern. Können wir einen kleinen Bereich auf einer Seite anvisieren? – Unbreakable

+0

Ich denke, Sie können versuchen, in einem iframe zu laden. Habe es nie selbst versucht – Shyju