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

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

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

Que puis-je faire?

162
demandé sur Peter Mortensen 2011-06-09 17:54:44

13 réponses

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

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

pour que le fichier soit téléchargé plutôt que consulté:

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 pourraient autrement casser la capacité du navigateur à gérer la réponse.

317
répondu ColinM 2018-03-28 18:52:46

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 si fourni, il prendra ce nom pour le fichier téléchargé.

19
répondu Akshay 2018-03-28 18:56:56

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

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

  • téléchargement forcé / invite: utiliser 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:

  • utiliser l'attribut HTML5 download . Il utilise le nom de fichier spécifié dans la vue de côté.

NOTE: je préfère définir le nom du fichier du côté du serveur car vous pouvez avoir plus d'informations et utiliser du code commun.

12
répondu Christophe Roussy 2018-03-28 18:59:32

si vous avez Apache ajoutez ceci au fichier .htaccess :

<FilesMatch "\.(?i:pdf)$">
    ForceType application/octet-stream
    Header set Content-Disposition attachment
</FilesMatch>
5
répondu Alex 2018-03-28 19:08:01

Oops, 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 voulez pas que le navigateur invite l'utilisateur, utilisez" inline "pour la troisième chaîne de caractères au lieu de"attachment". Inline fonctionne très bien. L'affichage PDF immédiatement sans demander à l'utilisateur de cliquer sur Ouvrir. J'ai utilisé "attachment" et ceci demandera à l'utilisateur D'Ouvrir, Enregistrer. J'ai essayé de changer le paramètre du navigateur mais ça n'empêche pas l'invite.

1
répondu trangsinh1952 2014-11-22 21:54:42

c'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
répondu Leon van Wyk 2016-11-29 11:05:41

vous pouvez le faire de la manière suivante:

<a href="path to PDF file">Open PDF</a>

si le fichier PDF est à l'intérieur d'un dossier et que ce dossier n'a pas la permission d'accéder aux fichiers dans ce dossier directement, alors vous devez contourner certaines restrictions d'accès au fichier en utilisant le paramètre .htaccess fichier de cette façon:

<FilesMatch ".*\.(jpe?g|JPE?G|gif|GIF|png|PNG|swf|SWF|pdf|PDF)$" >
    Order Allow,Deny
    Allow from all
</FilesMatch>

mais maintenant autoriser juste certains fichiers nécessaires.

j'ai utilisé ce code et il a fonctionné parfaitement.

-1
répondu Mohsin 2018-03-28 18:55:53

si vous utilisez CodeIgniter.

Veuillez définir:

$htmlpdf -> Output($pdf_local_path, f); to $htmlpdf -> Output(); exit;
-1
répondu oparam 2018-03-28 19:09:03

ouvrir les téléchargements.php de rootfile.

ensuite, allez à la ligne 186 et changez-la comme suit:

        if(preg_match("/\.jpg|\.gif|\.png|\.jpeg/i", $name)){
            $mime = getimagesize($download_location);
            if(!empty($mime)) {
                header("Content-Type: {$mime['mime']}");
            }
        }
        elseif(preg_match("/\.pdf/i", $name)){
            header("Content-Type: application/force-download");
            header("Content-type: application/pdf");
            header("Content-Disposition: inline; filename=\"".$name."\";");
        }

        else{
            header("Content-Type: application/force-download");
            header("Content-type: application/octet-stream");
            header("Content-Disposition: attachment; filename=\"".$name."\";");
        }
-2
répondu Christian Felix Kazuya 2015-12-04 17:18:28

utiliser

<embed src="file.pdf" />

si l'intégration est une option ou mon nouveau plugin, PIFF: https://github.com/terrasoftlabs/piff

-3
répondu Gabriel Ryan Nahmias 2012-04-25 05:06:52

Voici une autre méthode pour forcer un fichier à voir dans le navigateur en PHP:

$extension = pathinfo($file_name, PATHINFO_EXTENSION);
$url = 'uploads/'.$file_name;
        echo '<html>'
                .header('Content-Type: application/'.$extension).'<br>'
                .header('Content-Disposition: inline; filename="'.$file_name.'"').'<br>'
                .'<body>'
                .'<object   style="overflow: hidden; height: 100%;
             width: 100%; position: absolute;" height="100%" width="100%" data="'.$url.'" type="application/'.$extension.'">
                    <embed src="'.$url.'" type="application/'.$extension.'" />
             </object>'
            .'</body>'
            . '</html>';
-4
répondu user28864 2018-03-28 19:04:37

just open Adobe Reader, menu → Edit Preferences Internet , puis changer le mode du navigateur ou pour des instructions détaillées sur différents navigateurs essayer Display PDF in browser | Acrobat, Acrobat Reader .

-6
répondu lawl 2018-03-28 19:07:31

si vous créez un lien vers un .PDF il s'ouvrira dans le navigateur.

Si la case n'est pas cochée, elle doit être liée à A.zip pour forcer le téléchargement.

Si A.zip n'est pas une option, puis utiliser headers en PHP pour forcer le téléchargement

header('Content-Type: application/force-download'); 
header('Content-Description: File Transfer'); 
-7
répondu Kirk Strobeck 2011-06-09 13:56:57