2015-12-28 14 views
10

Sto modificando del codice e c'è un metodo che restituisce il tipo FileContentResult. Ottengo un flusso dal servizio, quindi per me sarebbe più comodo cambiare il tipo di ritorno a FileStreamResult.Differenza tra FileContentResult e FileStreamResult

Devo convertire lo stream in array per restituire FileContentResult?

Oppure posso semplicemente modificare il tipo di reso in modo sicuro?

risposta

16

FileResult è una classe di base astratta per tutti gli altri.

  • FileContentResult - usarlo quando si dispone di un array di byte che si piacerebbe tornare come un file
  • FileStreamResult - si ha un flusso aperto, si desidera tornare è contenuto come un file
12

Entrambe FileStreamResult e FileContentResult ereditano da FileResult che eredita da ActionResult. Così si può tornare sia un tipo da un metodo che ha ActionResult come tipo di ritorno

Se si dispone già di un flusso , è possibile utilizzare FileStreamResult costruttore per restituire un 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)); 
} 

Se si dispone già di un arrray byte, è possibile utilizzare FileContentResult costruttore per restituire un 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)); 
} 

Il metodo Controller.File ha sovraccarichi che richiede sia una matrice di byte o un flusso

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

Se il browser ha il supporto per visualizzare il tipo di contenuto della risposta, la risposta verrà visualizzata nel browser. Ad esempio, per il codice di cui sopra, verrà visualizzato il contenuto del pdf nel browser.

C'è un altro sovraccarico del metodo File che prende il nome del file di download che verrà utilizzato dalla finestra di dialogo di salvataggio/download del browser in modo che l'utente possa salvarlo sul computer locale e/o aprire.

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

Con questo, l'utente riceverà un prompt di download dal browser.

+3

Il cliente non può dire la differenza. Il client non è in grado di scoprire quale classe .NET è stata utilizzata per inviare byte al browser. – usr

+0

Cosa succede se ho bisogno di mostrare il file in una particolare sezione della pagina web. Attualmente filestream renderà l'intera pagina web. Possiamo indirizzare una piccola area in una pagina? – Unbreakable

+0

Immagino che tu possa provare a caricare in un iframe. Non ho mai provato da solo se – Shyju