2013-10-16 24 views
37

Ich habe ein MVC-Projekt, das einige Dokumente für Benutzer anzeigen wird. Die Dateien werden derzeit im Azure-Blobspeicher gespeichert.Lassen Sie eine Datei im Browser öffnen, anstatt sie herunterzuladen

Derzeit werden die Dokumente aus der folgenden Controller-Aktion abgerufen:

[GET("{zipCode}/{loanNumber}/{classification}/{fileName}")] 
public ActionResult GetDocument(string zipCode, string loanNumber, string classification, string fileName) 
{ 
    // get byte array from blob storage 
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName); 
    string mimeType = "application/octet-stream"; 
    return File(doc, mimeType, fileName); 
} 

Gerade jetzt, wenn ein Benutzer auf einen Link wie folgt klickt:

<a target="_blank" href="http://...controller//GetDocument?zipCode=84016&loanNumber=12345678classification=document&fileName=importantfile.pdf 

Dann werden die Datei-Downloads zu den Download-Ordner ihres Browsers. Was ich gerne machen würde (und ich dachte, das war das Standardverhalten) ist, dass die Datei einfach im Browser angezeigt wird.

Ich habe versucht, den Mimetype zu ändern und den Rückgabetyp zu FileResult statt ActionResult zu ändern, beide vergebens.

Wie kann ich die Datei im Browser anzeigen, anstatt sie herunterzuladen?

+3

Ziemlich sicher, entscheidet der Browser, wie die Datei auf dem mime Basis zu behandeln. http://www.webmaster-toolkit.com/mime-types.shtml – Tommy

+0

Das ist, was ich auch vermutete, also versuchte ich verschiedene mimetypes, die mit .pdfs verbunden sind und versuchte, die Datei zu öffnen, aber es jedes Mal heruntergeladen. Wenn ich andere PDFs auf anderen Seiten anschaue, öffnen sie sich im Browserfenster. – Trevor

+2

Welchen Wert hat der Content-Dispositionskopf? –

Antwort

76

Dank allen Antworten war die Lösung eine Kombination aller von ihnen.

Erstens, weil ich eine byte[] die Controller-Aktion verwendet wurde FileContentResult nicht nur FileResult. Gefunden das dank: What's the difference between the four File Results in ASP.NET MVC

Zweitens musste der MIME-Typ nicht ein octet-stream sein. Angeblich verursacht die Verwendung des Streams, dass der Browser die Datei einfach herunterlädt. Ich musste den Typ application/pdf ändern. Ich werde jedoch eine robustere Lösung für die Handhabung anderer Datei-/MIME-Typen suchen müssen.

Drittens musste ich eine Kopfzeile hinzufügen, die die content-disposition zu inline änderte. Unter Verwendung von this post fand ich heraus, dass ich meinen Code ändern musste, um doppelte Header zu verhindern, da die Content-Disposition bereits auf attachment gesetzt war.

Der erfolgreiche Code:

public FileContentResult GetDocument(string zipCode, string loanNumber, string classification, string fileName) 
{ 
    byte[] doc = _docService.GetDocument(zipCode, loanNumber, classification, fileName); 
    string mimeType = "application/pdf" 
    Response.AppendHeader("Content-Disposition", "inline; filename=" + fileName); 
    return File(doc, mimeType); 
} 
+14

Eine robustere Lösung um Mimetype zu bekommen: 'return File (doc, MimeMapping.GetMimeMapping (Dateiname));' – Trevor

+1

Awesome du hast es gelöst. Der Link, den ich in den obigen Kommentar gesetzt habe, ermöglicht es Ihnen, ein Wörterbuch zu erstellen, das auf Dateierweiterungen für MimeTypes basiert. Dann erstellen Sie einfach eine statische Funktion, die eine Dateierweiterung akzeptiert und einen MIME-Typ für jede Datei zurückgibt, die Sie erwarten (ich würde z. B. wahrscheinlich .crt nicht abdecken). Wenn eine Erweiterung nicht gefunden wird, gib den Standard * application/octet-stream * zurück – Tommy

+1

Arbeite wie ein Zauber! Beste Lösung. – Khateeb321

3

Browser sollten entscheiden, auf Mime-Typ herunterzuladen oder anzuzeigen.

Try this:

string mimeType = "application/pdf"; 
12

Es sieht aus wie jemand gefragt, sonst eine ähnliche Frage vor einer Weile:

how to force pdf files to open in a browser

mit einer Antwort zu sagen, dass Sie den Header verwendet werden sollen:

Content-Disposition: inline; filename.pdf 
+0

Ok, also habe ich das leider versucht und musste den Schritten im verlinkten Post folgen, aber es funktioniert immer noch nicht. Ich habe versucht, den Rückgabetyp zu FileContentResult zu ändern, und das hat auch nicht geholfen. – Trevor

+1

Das war definitiv ein Teil der Lösung, danke! – Trevor

+1

np, froh, dass es geklappt hat – welegan

Verwandte Themen