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?
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.
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é.
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:
header("Content-Disposition", "attachment; filename=myfilename.myextension");
header("Content-Disposition", "inline; filename=myfilename.myextension");
Pas de contrôle sur le code du serveur:
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.
Si vous avez Apache, ajoutez ceci dans le fichier .htaccess
:
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
</FilesMatch>
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.
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");
}