Ouvrir un fichier dans le navigateur au lieu de le télécharger

j'ai un projet MVC qui affichera certains documents aux utilisateurs. Les fichiers sont actuellement stockés dans Azure blob storage.

actuellement, les documents sont extraits de l'action suivante du contrôleur:

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

maintenant, quand un utilisateur clique sur un lien comme suit:

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

puis, les téléchargements de fichiers dans le dossier Téléchargements de leur navigateur. Ce que je voudrais arriver (et je pensais par défaut comportement) est pour le fichier de simplement être affiché dans le navigateur.

j'ai essayé de changer le type mimetype et de changer le type de retour à FileResult au lieu D'ActionResult, les deux en vain.

Comment faire pour que le fichier s'affiche dans le navigateur au lieu de le télécharger?

42
demandé sur tereško 2013-10-16 22:47:06

3 réponses

grâce à toutes les réponses, la solution était une combinaison de toutes.

tout d'abord, parce que j'utilisais un byte[] , l'action du contrôleur devait être FileContentResult et pas seulement FileResult . Trouvé cela grâce à: Quelle est la différence entre les quatre résultats de fichier ASP.NET MVC

deuxièmement, le type mime ne devait pas être un octet-stream . Soi-disant, l'utilisation du flux provoque le navigateur à juste télécharger fichier. J'ai dû changer le type application/pdf . J'ai besoin d'explorer une solution plus robuste pour gérer d'autres fichier/types mime.

Troisièmement, j'ai dû ajouter un en-tête qui a changé le content-disposition en inline . En utilisant ce post j'ai compris que je devais modifier mon code pour éviter les en-têtes en double, puisque le contenu-disposition était déjà défini à attachment .

La réussite de 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);
} 
84
répondu Trevor 2017-05-23 12:03:05

on dirait que quelqu'un d'autre a posé une question similaire il y a un certain temps:

comment forcer les fichiers pdf à s'ouvrir dans un navigateur

avec une réponse disant que vous devez utiliser l'en-tête:

Content-Disposition: inline; filename.pdf
15
répondu welegan 2017-05-23 12:18:01

les navigateurs doivent décider de télécharger ou d'afficher en fonction du type mime.

essayez ceci:

string mimeType = "application/pdf";
4
répondu André Pena 2013-10-16 19:11:00