286 votes

Comment puis-je forcer les fichiers à s'ouvrir dans le navigateur au lieu de les télécharger (PDF) ?

Existe-t-il un moyen de forcer les fichiers PDF à s'ouvrir dans le navigateur lorsque l'option "Afficher le PDF dans le navigateur" n'est pas cochée ?

J'ai essayé d'utiliser la balise embed et un iframe, mais cela ne fonctionne que lorsque cette option est cochée.

Qu'est-ce que je peux faire ?

534voto

ColinM Points 2701

Pour indiquer au navigateur que le fichier doit être visualisé dans le navigateur, la balise HTTP réponse doit inclure ces en-têtes :

Content-Type: application/pdf
Content-Disposition: inline; filename="filename.pdf"

Pour que le fichier téléchargé plutôt que de les voir :

Content-Type: application/pdf
Content-Disposition: attachment; filename="filename.pdf"

Les guillemets autour du nom de fichier sont nécessaires si le nom de fichier contient des caractères spéciaux tels que filename[1].pdf qui pourrait autrement empêcher le navigateur de traiter la réponse.

La manière dont vous définissez les en-têtes de réponse HTTP dépend de votre serveur HTTP (ou, si vous générez la réponse PDF à partir d'un code côté serveur : de votre langage de programmation côté serveur).

20voto

Christophe Roussy Points 2347

Le type correct est application/pdf pour le PDF, et non application/force-download . Cela ressemble à un hack pour certains anciens navigateurs. Utilisez toujours le mimetype correct si vous le pouvez.

Si vous avez le contrôle sur le code du serveur :

  • Téléchargement forcé/prompt : utilisation header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Le navigateur tente de l'ouvrir : utiliser header("Content-Disposition", "inline; filename=myfilename.myextension");

Aucun contrôle sur le code du serveur :

REMARQUE : Je préfère définir le nom de fichier du côté du serveur car vous disposez de plus d'informations et pouvez utiliser un code commun.

19voto

Akshay Points 423

Si vous utilisez HTML5 (et je suppose qu'aujourd'hui tout le monde l'utilise), il y a un attribut appelé download .

Par exemple,

<a href="somepathto.pdf" download="filename">

Ici filename est facultatif, mais s'il est fourni, il prendra ce nom pour le fichier téléchargé.

2 votes

Si vous avez le contrôle sur le code du serveur, vous devriez utiliser 'attachement' car cela permettra d'utiliser le même code de génération de nom de fichier. Si vous n'avez aucun contrôle sur le serveur, c'est une bonne solution.

0 votes

C'est une solution brillante au problème mais, comme toujours, IE nous empêche de l'utiliser : caniuse.com/#search=download

0 votes

L'Edge le prend en charge, mais pas le Safari. Réf. w3schools.com/tags/att_a_download.asp

4voto

Ashfaq nisar Points 572

J'avais le même problème et la plupart des les réponses ci-dessus devraient résoudre votre problème . Malheureusement, même si j'étais recevoir les en-têtes content-type et content-disposition dans la réponse mais mon pdf est toujours téléchargé au lieu d'être affiché . Après avoir réfléchi et essayé pendant de nombreuses heures.

Le coupable était firefox d'une certaine manière, c'était moi . Rire nerveux

Par défaut Lorsque vous ouvrez un fichier PDF dans Firefox, une fenêtre contextuelle s'affiche pour vous permettre de choisir entre les options suivantes sauvegarder le fichier pdf ou pour l'ouvrir directement et il y a aussi une case à cocher qui dit faire cette action automatiquement à partir de maintenant et devinez qui l'a choisi.

A cause de cette erreur, mon pdf a été téléchargé plutôt que visualisé même si elle avait tous les en-têtes requis dans la réponse . Il s'agit d'un simple erreur mais m'a coûté une bonne quantité de temps.

Pour résoudre ce problème, il suffit de aller aux paramètres et recherche d'applications et Changez le paramètre pdf selon vos besoins.

1voto

Leon van Wyk Points 11

Ceci est pour ASP.NET MVC

Dans votre page cshtml :

<section>
    <h4><a href="@Url.Action("Download", "Document", new { id = @Model.GUID })"><i class="fa fa-download"></i> @Model.Name</a></h4>
    <object data="@Url.Action("View", "Document", new { id = @Model.GUID })" type="application/pdf" width="100%" height="800" class="col-md-12">
        <h2>Your browser does not support viewing PDFs, click on the link above to download the document.</h2>
    </object>
</section>

Dans votre contrôleur :

public ActionResult Download(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        return File(model.FilePath, "application/pdf", model.FileName);
    }

public FileStreamResult View(Guid id)
    {
        if (id == Guid.Empty)
            return null;

        var model = GetModel(id);

        FileStream fs = new FileStream(model.FilePath, FileMode.Open, FileAccess.Read);

        return File(fs, "application/pdf");
    }

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