3 votes

Comment créer un lien de téléchargement d'un PDF qui ne nécessite pas de clic droit ?

Je travaille sur un site web où le visiteur devrait pouvoir télécharger un fichier pdf. (Il y a trois liens à choisir, mais cela n'a pas d'importance). Je voulais savoir comment faire pour que le visiteur puisse simplement cliquer sur le lien et ne pas avoir à

right click > Save (target) As...

Je suis ouvert aux solutions PHP ou Javascript. Merci de votre compréhension.

EDIT : Puis-je utiliser javascript pour appeler le PHP et enregistrer le fichier via AJAX ?

EDIT2 : J'ai finalement utilisé la solution de Nirmal, car c'était la plus simple à modifier pour les trois fichiers. Je n'ai pas eu besoin de créer 3 fichiers pour les trois PDF et je n'ai pas eu besoin de coder à la main le changement. C'est BalusC qui remporte la palme puisque son code a été publié en premier et qu'il fait aussi l'affaire.

13voto

BalusC Points 498232

Tout ce que vous avez à faire, c'est de définir le paramètre Content-Disposition à l'en-tête attachment pour obtenir une boîte de dialogue "Enregistrer sous". Voici un exemple de PHP de démarrage :

<?php
    header('Content-Type: application/pdf');
    header('Content-Disposition: attachment;filename="foo.pdf"');
    readfile('/path/to/foo.pdf');
?>

Vous ne pouvez pas et ne voulez pas faire cela avec Javascript.

Note importante : en raison d'une mauvaise fonctionnalité, dans MSIE, le nom de fichier par défaut dans la boîte de dialogue "Enregistrer sous" ne sera pas dérivé de l'élément content-disposition il sera à la place la dernière partie de l'information sur le chemin d'accès dans l'URL de la requête. Pour contourner ce problème, ajoutez le nom du fichier PDF au lien, par exemple http://example.com/pdf/foo.pdf . Vous pouvez même l'utiliser en PHP pour lire le fichier PDF spécifié par pathinfo. Voici un exemple basique de pdf.php :

<?php
    $file_name = $_SERVER['PATH_INFO'];
    $file = '/path/to/pdf/files' . $file_name;
    if (file_exists($file)) {
        header('Content-Type: application/pdf');
        header('Content-Disposition: attachment;filename="' . basename($file_name) . '"');
        header('Content-Length: ' . filesize($file));
        readfile($file);
    } else {
        header('HTTP/1.1 404 Not Found');
    }
?>

Cela suppose toutefois que vous ayez MultiViews de manière à ce que /pdf/ passera par ce fichier PHP, ou au moins par un fichier RewriteRule de /pdf/ à /pdf.php/ .

Le principal avantage de cette approche est qu'il n'est pas nécessaire de modifier le code chaque fois que vous souhaitez ajouter un nouveau fichier PDF ou changer le nom du fichier PDF.

Vous pouvez même le rendre plus générique en déterminant et en définissant automatiquement le type de contenu approprié :

<?php
    $file_name = $_SERVER['PATH_INFO'];
    $file = '/path/to/all/files' . $file_name;
    if (file_exists($file)) {
        header('Content-Type: ' . mime_content_type($file_name));
        header('Content-Disposition: attachment;filename="' . basename($file_name) . '"');
        header('Content-Length: ' . filesize($file));
        readfile($file);
    } else {
        header('HTTP/1.1 404 Not Found');
    }
?>

Le nommer files.php et vous avez alors un téléchargeur PHP générique auquel vous pouvez accéder par exemple par http://example.com/files/foo.pdf , http://example.com/files/bar.zip etc.

J'espère que cela vous aidera.

3voto

rjmunro Points 10522

Plutôt que de devoir écrire des scripts PHP wrapper scripts, si vous utilisez Apache, vous pouvez le faire avec un fichier .htaccess dans le dossier contenant les PDF :

<Files *.pdf>
  Header set Content-Disposition attachment
</Files>

Apparemment, certaines versions d'IE / Adobe Reader ne respectent pas l'option Content-Disposition l'en-tête. Vous pouvez contourner ces problèmes à l'aide de ForceType application/octet-stream

<Files *.pdf>
  ForceType application/octet-stream
  Header set Content-Disposition attachment
</Files>

2voto

ksg91 Points 1209

Si vous ne voulez pas vous encombrer de code côté serveur et si ce n'est pas une priorité pour vous, vous pouvez utiliser HTML5. download attribut.

Ejemplo:

<a href="myfile.pdf" download>Download</a>

Cependant, cette fonctionnalité n'est pas prise en charge par tous les navigateurs. Conformément à la w3schools Les navigateurs suivants sont pris en charge :

Chrome (14+), Firefox (20+), Opera (15+).

Vous pouvez également spécifier le nom du fichier en donnant une valeur à download attr :

<a href="myfile.pdf" download="NewName.pdf">Download</a>

1voto

Amber Points 159296

Essayez d'utiliser PHP pour servir le fichier en envoyant d'abord un en-tête de Content-type: application/octet-stream .

1voto

Jeffrey Aylesworth Points 2889

Vous pouvez ajouter un en-tête HTTP pour le faire, il y a un exemple dans la page Docs PHP (Voir exemple 1)

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