ASP.Net contenu de base-Disposition pièce jointe/en ligne

je retourne un fichier d'un contrôleur WebAPI. La valeur de l'en-tête Content-Disposition est automatiquement définie à"attachment". 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 mettre "inline" au lieu de "attachment"?

j'envoie le fichier en utilisant 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;
}
16
demandé sur CodeCaster 2016-08-11 16:28:58

6 réponses

la meilleure façon que j'ai trouvée est d'ajouter les en-têtes content-disposition 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");
}
28
répondu Ashley Lee 2016-08-12 04:20:21

é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[]...) charge ou utilise FileContentResult), vous pouvez utiliser le File(Stream, string, string) 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 utiliser un type de réponse existant qui supporte la diffusion en continu, comme un FileStreamResult, et de définir le contenu-disposition vous-même. La manière canonique de le faire, comme démontré dans le 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");
8
répondu CodeCaster 2016-11-08 15:00:08

File() 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 :-)

2
répondu myro 2017-10-06 10:14:35

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;
}
1
répondu Ja9ad335h 2016-08-11 14:32:26

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, il suffit de ommitter l'argument filename à File était suffisant pour déclencher une disposition de contenu en ligne.

return File(fileStream, contentType, fileName); // attachment
return File(fileStream, contentType);           // inline
0
répondu Jonathan Wilson 2018-07-06 19:35:44

Une Asp.Net MVC approche en utilisant une approche similaire à @ashley-lee

Remarque: Chrome télécharge la pièce jointe. Voir la liste Ctrl-J. Mais, si l'utilisateur choisit "ouvrir" , il ouvrira "dans le navigateur", un utilisateur devra choisir "Ouvrir dans la visionneuse de système". Par exemple, les champs de signature PDF ne sont pas visibles dans les lecteurs PDF basés sur le navigateur.

[HttpGet]
public ActionResult GenericForm()
{
    return new DownloadFileAsAttachmentResult(@"GenericForm.pdf", @"\Content\files\GenericForm.pdf", "application/pdf");
}

public class DownloadFileAsAttachmentResult : ActionResult
{
    private string _filenameWithExtension { get; set; }
    private string _filePath { get; set; }
    private string _contentType { get; set; }
    // false = prompt the user for downloading;  true = browser to try to show the file inline
    private const bool DisplayInline = false;

    public DownloadFileAsAttachmentResult(string FilenameWithExtension, string FilePath, string ContentType)
    {
        _filenameWithExtension = FilenameWithExtension;
        _filePath = FilePath;
        _contentType = ContentType;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        HttpResponseBase response = context.HttpContext.Response;
        response.Buffer = false;
        response.ContentType = _contentType;
        response.AddHeader("Content-Disposition", "attachment; filename=" + _filenameWithExtension); // force download
        response.AddHeader("X-Content-Type-Options", "nosniff");

        response.TransmitFile(_filePath);
    }
}
0
répondu OzBob 2018-09-07 07:17:36