Forcer le téléchargement d'un fichier

Rechercher

Forcer le téléchargement d'un fichier

  • Par Emacs
  • 11 commentaires
  • 40008 lectures
  • RSS -  Atom

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 14/12/2007 22:32

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 14/12/2007 22:44

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

3. Par raks le 29/12/2007 11:42

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 03/03/2008 00:46

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 15/03/2008 14:47

@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 31/05/2008 16:02

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 19/11/2008 22:56

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 15/01/2009 01:51

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 25/06/2009 17:42

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é.

10. Par BARAA le 06/07/2009 04:52

oui ca marche et c'est utile mais ca pose encore des problémes

11. Par Patheticcockroach le 20/07/2009 14:54

L'objet du tuto ne correspondait pas à ce que je cherchais, néanmoins je crois que le contenu si: est-ce qu'avec ce script l'utilisateur n'a aucun moyen de connaître le chemin du fichier téléchargé (dans l'exemple "./documents/compte.pdf"? Autrement dit, est-ce que je peux utiliser un script de ce genre pour restreindre le téléchargement d'un fichier? Merci