Forcer le téléchargement d'un fichier - Apprendre-PHP.com

Rechercher
Boutique en ligne, solution e-commerce, script PHP et PERL : RAYNETTE

Forcer le téléchargement d'un fichier

Forcer le téléchargement d'un fichier

Cette portion de script présente un moyen simple et efficace de forcer le téléchargement d'un fichier. Comment ça forcer un téléchargement ? Prenons l'exemple concret d'un fichier PDF car c'est celui qui semble le plus approprié pour ce genre de code.

L'utilisation d'un document PDF peut varier d'un utilisateur à un autre. En effet, certains pourront l'ouvrir directement dans leur navigateur via un plugin intégré tandis que d'autres seront obligés de le télécharger puis de l'ouvrir avec Adobe Acrobat Reader par exemple. Afin d'uniformiser ces différents comportements, nous pouvons choisir de forcer le téléchargement du document. C'est donc l'objet du script suivant :

Le script complet

Fonction permettant de forcer le téléchargement d'un fichier
<?php
/*******************************************************
* Déclaration de la fonction
*******************************************************/
/**
* La fonction force le téléchargement d'un fichier
*
* @author : Hugo HAMON
* @param : string $nom nom du fichier
* @param : string $situtation emplacement sur le serveur web
* @param : integer $poids poids du fichier en octets
* @return : void
**/
function forcerTelechargement($nom, $situation, $poids)
{
header('Content-Type: application/octet-stream');
header('Content-Length: '. $poids);
header('Content-disposition: attachment; filename='. $nom);
header('Pragma: no-cache');
header('Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
header('Expires: 0');
readfile($situation);
exit();
}
/*******************************************************
* Appel de la fonction
*******************************************************/
forcerTelechargement('compte.pdf', './documents/compte.pdf', 10000);
?>


Les commentaires

1. Par Biohazard2 le vendredi 14 décembre 2007 à 22:10

Il me semble que Firefox contourne ce type MIME. J'ai pris l'habitude d'utiliser "application/x-rar-compressed" car Firefox ne le connait pas, il ne propose donc que de le télécharger.

2. Par Emacs le vendredi 14 décembre 2007 à 22:10

Pas bête comme idée mais donc tu envoies un mime qui n'existe pas pour lui. A retenir malgré tout comme solution Emoticone clin d'oeil

3. Par raks le samedi 29 décembre 2007 à 11:11

Ce code ne fonctionne pas. L'extension n'est pas retenue lors du téléchargement du fichier.
De plus, si le nom du fichier contient des espaces, seul le premier string est pris en compte

4. Par Jacouille le lundi 03 mars 2008 à 00:12

J'ai tenté d'utiliser ce code, mais pour toute réponse, il me lit effectivement le fichier pdf, mais en mode "texte", comme si je l'ouvrais avec Vi, en quelque sorte...

5. Par Biohazard2 le samedi 15 mars 2008 à 14:02

@Emacs : Je me suis mal exprimé : Firefox connait ce type MIME mais ne sait pas ce qu'est une archive RAR. Il n'a pas d'extension pour lire un tel fichier, donc il ne propose que de le télécharger.

Il doit y avoir d'autres types MIME de ce type, ce qui offre une solution à long terme.

6. Par kooglox le samedi 31 mai 2008 à 16:04

Bonjour, Chez moi, ce script fonctionne très bien, seulement quand il télécharge des gros fichiers images (2,5 Mo), l'image est découpé en trois parties et mal disposé... bref ça ressemble plus à grand chose. Ca le fait sous firefox et sous IE. Personne n'a un petit conseil pour palier à ce disfonctionnement ?

7. Par Daveledave le mercredi 19 novembre 2008 à 22:10

Bonjour, je souhaiterai appliquer cette fonction à un fichier pdf qui n'est pas sur mon site. Est-elle déclinable pour télécharger des fichiers stockés sur un autre serveur web que celui duquel est exécuté le script ? Merci !

8. Par jules le jeudi 15 janvier 2009 à 01:01

Pour répondre à raks, pour le probleme des espaces, il faut remplacer la ligne :
header('Content-disposition: attachment; filename='. $nom);
Par :
header('Content-disposition: attachment; filename="'.$nom.'"');

Merci bien pour le code, cela m'a bien aidé.

9. Par stevie21 le jeudi 25 juin 2009 à 17:05

J'ai essayé ce script et je suis effectivement en mesure de télécharger le PDF sur mon ordinateur. Cependant, lorsque je tente de l'ouvrir, adobe reader me donne comme message qu'il ne peut pas ouvrir le document, car il n'est pas pris en charge.

Si vous savez comment régler ce problème, ce serait bien apprécié.

Ajouter un commentaire

Votre avis
Se souvenir de mes informations