web-dev-qa-db-fra.com

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

Existe-t-il un moyen de forcer l’ouverture des fichiers PDF dans le navigateur lorsque l’option "Afficher PDF dans le navigateur" est désactivée?

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

Que puis-je faire?

170
elloalisboa

Pour indiquer au navigateur que le fichier doit être visualisé dans le navigateur:

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

Pour que le fichier soit téléchargé plutôt que visualisé:

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

Les guillemets autour du nom de fichier sont obligatoires si le nom de fichier contient des caractères spéciaux tels que filename[1].pdf, qui risqueraient sinon d'empêcher le navigateur de traiter la réponse.

340
ColinM

Si vous utilisez HTML5 (et je suppose que tout le monde l’utilise maintenant), il existe 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é.

20
Akshay

Le type correct est application/pdf pour PDF, pas application/force-download. Cela ressemble à un hack pour certains navigateurs hérités. Utilisez toujours le type MIME correct si vous le pouvez.

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

  • Téléchargement/invite forcés: utilisez header("Content-Disposition", "attachment; filename=myfilename.myextension");
  • Le navigateur essaie de l'ouvrir: utilisez header("Content-Disposition", "inline; filename=myfilename.myextension");

Pas de contrôle sur le code du serveur:

  • Utilisez l'attribut de téléchargement HTML5 . Il utilise le nom de fichier personnalisé spécifié du côté de la vue.

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

13
Christophe Roussy

Si vous avez Apache, ajoutez ceci dans le fichier .htaccess:

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>
4
Alex

Oups, il y avait des erreurs de frappe dans mon post précédent.

    header("Content-Type: application/force-download");
    header("Content-type: application/pdf");
    header("Content-Disposition: inline; filename=\"".$name."\";");

Si vous ne souhaitez pas que le navigateur Invite l'utilisateur, utilisez "inline" pour la troisième chaîne au lieu de "pièce jointe". Inline fonctionne très bien. L'affichage PDF immédiatement sans demander à l'utilisateur de cliquer sur Ouvrir. J'ai utilisé "pièce jointe" et cela invitera l'utilisateur à ouvrir, enregistrer. J'ai essayé de changer le paramètre du navigateur, cela n'empêche pas l'invite.

2
trangsinh1952

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");
    }
0
Leon van Wyk