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?
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.
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é.
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.
si vous avez Apache ajoutez ceci au fichier .htaccess
:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
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.
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");
}
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.
si vous utilisez CodeIgniter.
Veuillez définir:
$htmlpdf -> Output($pdf_local_path, f); to $htmlpdf -> Output(); exit;
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."\";");
}
utiliser
<embed src="file.pdf" />
si l'intégration est une option ou mon nouveau plugin, PIFF: https://github.com/terrasoftlabs/piff
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>';
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 .
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');