web-dev-qa-db-fra.com

Ouvre 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 le stockage d'objets blob Azure.

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

À l'heure actuelle, lorsqu'un utilisateur clique sur un lien comme suit:

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

Ensuite, le fichier est téléchargé dans le dossier de téléchargement de son navigateur. Ce que je voudrais faire (et je pensais que c'était le comportement par défaut), c'est que le fichier soit simplement affiché dans le navigateur.

J'ai essayé de changer le type MIME et de changer le type de retour en FileResult au lieu de ActionResult, les deux en vain.

Comment puis-je afficher le fichier dans le navigateur au lieu de le télécharger?

47
Trevor

Merci à toutes les réponses, la solution a été une combinaison de toutes.

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

Deuxièmement, le type mime ne devait PAS être un octet-stream. Soi-disant, l’utilisation du flux entraîne le téléchargement du fichier par le navigateur. Je devais changer de type application/pdf. J'aurai besoin d'explorer une solution plus robuste pour gérer d'autres types de fichiers/mime.

Troisièmement, je devais ajouter un en-tête qui modifiait le content-disposition à inline. Utilisation de this post J'ai compris que je devais modifier mon code pour éviter les en-têtes en double, car la disposition du contenu était déjà définie sur attachment.

Le code réussi:

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

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

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

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

Content-Disposition: inline; filename.pdf
15
welegan

Les navigateurs devraient décider de télécharger ou d’afficher en fonction du type mime.

Essaye ça:

string mimeType = "application/pdf";
4
André Pena