47 votes

ASP.Net Core Content-Disposition de la pièce jointe/inline

Je suis de retour d'un fichier à partir d'un WebAPI contrôleur. L'-tête Content-Disposition de la valeur est automatiquement réglé sur "pièce jointe". Par exemple:

Disposition: attachment; filename="30956.pdf"; filename*=UTF-8"30956.pdf

Quand il est à l'attachement, le navigateur vous demandera d'enregistrer le fichier au lieu de l'ouvrir. Je voudrais pour l'ouvrir.

Comment puis-je configurer en mode "inline" au lieu de "l'attachement"?

Je suis d'envoyer le fichier à l'aide de cette méthode:

public IActionResult GetDocument(int id)
{
    var filename = $"folder/{id}.pdf";
    var fileContentResult = new FileContentResult(File.ReadAllBytes(filename), "application/pdf")
    {
        FileDownloadName = $"{id}.pdf"
    };
    // I need to delete file after me
    System.IO.File.Delete(filename);

    return fileContentResult;
}

71voto

Ashley Lee Points 2575

La meilleure façon que j'ai trouvé est d'ajouter du contenu-disposition des en-têtes manuellement.

private IActionResult GetFile(int id)
{
       var file = $"folder/{id}.pdf";

       // Response...
       System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
       {
              FileName = file,
              Inline = displayInline  // false = prompt the user for downloading;  true = browser to try to show the file inline
       };
       Response.Headers.Add("Content-Disposition", cd.ToString());
       Response.Headers.Add("X-Content-Type-Options", "nosniff");

       return File(System.IO.File.ReadAllBytes(file), "application/pdf");
}

52voto

Jonathan Wilson Points 1439

Avec la version 2.0.0 de AspNetCore et AspNetCore.Mvc, je l'ai trouvé aucune des réponses précédentes acceptables. Pour moi, tout simplement ommitting l'argument filename d' File était suffisant pour déclencher un contenu en ligne disposition.

return File(fileStream, contentType, fileName); // attachment
return File(fileStream, contentType);           // inline

10voto

CodeCaster Points 38181

Étant donné que vous ne voulez pas lire le fichier en mémoire à la fois dans un tableau d'octets (en utilisant les différents File(byte[]...) des surcharges ou à l'aide de FileContentResult), vous pouvez soit utiliser l' File(Stream, string, string) de surcharge, où le dernier paramètre indique le nom sous lequel le fichier sera présenté pour télécharger:

return File(stream, "content/type", "FileDownloadName.ext");

Ou vous pouvez tirer parti de l'existant type de réponse qui prend en charge le streaming, comme un FileStreamResult, et de définir le contenu-disposition vous-même. La manière canonique pour ce faire, comme l'a démontré l' FileResultExecutorBase, est tout simplement de définir l'en-tête vous-même la réponse, dans votre méthode d'action:

// Set up the content-disposition header with proper encoding of the filename
var contentDisposition = new ContentDispositionHeaderValue("attachment");
contentDisposition.SetHttpFileName("FileDownloadName.ext");
Response.Headers[HeaderNames.ContentDisposition] = contentDisposition.ToString();

// Return the actual filestream
return new FileStreamResult(@"path\to\file", "content/type");

5voto

myro Points 381

En tant que File() serait ignorer Content-Disposition j'ai utilisé ceci:

Response.Headers[HeaderNames.ContentDisposition] = new MimeKit.ContentDisposition { FileName = fileName, Disposition = MimeKit.ContentDisposition.Inline }.ToString();
return new FileContentResult(System.IO.File.ReadAllBytes(filePath), "application/pdf");

et ça fonctionne :-)

2voto

Ja9ad335h Points 2863

essayer avec de l' HttpResponseMessage

public IActionResult GetDocument(int id)
{
    var filename = $"folder/{id}.pdf";

    Response.Headers["Content-Disposition"] = $"inline; filename={id}.pdf";
    var fileContentResult = new FileContentResult(System.IO.File.ReadAllBytes(filename), "application/pdf")
    {
        FileDownloadName = $"{id}.pdf"
    };
    // I need to delete file after me
    System.IO.File.Delete(filename);

    return fileContentResult;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X