LoaderTool : une classe Symfony spécialisée dans le téléchargement
Je travaille actuellement sur une application proposant de nombreux fichiers au téléchargement. Dans ce cadre, il m'a pris l'envie de centraliser toutes les fonctions liées aux téléchargements dans une seule et même classe : LoaderTool est née. Cette classe est destinée aux applications utilisant le framework Symfony.
En premier lieu, téléchargez le fichier LoaderTool.class.php associé à cet article, et placez le dans un des dossiers "lib" de votre projet Symfony.
Remarque : Vous pouvez aussi être intéressés par :
- LoaderTool.class.php, pour PHP 5 sans Symfony.
- LoaderTool.class.php, pour PHP 4.
A l'aide de cette classe, vous disposez de plusieurs modes de téléchargements :
Téléchargement simple
Si vous souhaitez simplement présenter en téléchargement pour l'utilisateur un fichier présent sur votre disque dur, vous pouvez utiliser :
$filename = '/chemin/vers/mon/fichier.xls' LoaderTool::downloadContent($filename);
LoaderTool se charge de détecter le type MIME du fichier, et de le proposer à l'utilisateur avec pour nom le nom du fichier sur le disque de votre serveur (ici : fichier.xls).
Téléchargement avec un nom personnalisé
Dans cet exemple, nous proposons à nouveau le fichier "fichier.xls", mais cette fois ci, nous présentons un nom différent à l'utilisateur : 'export.xls'.
$filename = '/chemin/vers/mon/fichier.xls' LoaderTool::downloadContent($filename, 'export.xls');
LoaderTool se charge de détecter le type MIME du fichier, et de le proposer à l'utilisateur avec pour nom le deuxième paramètre de la méthode downloadContent.
Téléchargement "en ligne"
Si vous souhaitez que le contenu de votre fichier s'affiche directement dans le navigateur, au lieu que son téléchargement soit proposé à l'utilisateur, il faut activer le téléchargement "inline". Pour ce faire, utilisez le troisième paramètre de la méthode downloadContent :
$filename = '/chemin/vers/mon/fichier.pdf' LoaderTool::downloadContent($filename, null, True);
Dans cet exemple, le fichier PDF téléchargé s'ouvre directement dans le navigateur de l'utilisateur si un "plugin" de lecture de PDF est installé dans le navigateur (c'est souvent le cas sur les postes utilisant Microsoft Windows).
Téléchargement avec un type MIME différent
Si vous le souhaitez, il est possible de forcer le type MIME du téléchargement. Par exemple, pour forcer le fichier a être présenté comme un fichier PDF :
$filename = '/chemin/vers/mon/un-fichier-quelconque' LoaderTool::downloadContent($filename, 'fichier.pdf', False, 'application/pdf');
Quelque soit le type du fichier "un-fichier-quelconque", le navigateur le verra comme étant un fichier PDF. Utilisez cette fonctionnalité avec précaution.
Téléchargement d'un contenu en mémoire
Si vous souhaitez proposer au téléchargement un contenu généré par votre application PHP (par Imagick, GD, ou Tcpdf par exemple), il suffit de remplacer la variable $filename par $content qui contient le contenu. Le second paramètre "filename" devient alors obligatoire.
$contents = file_get_contents('/chemin/vers/mon/un-fichier-quelconque.pdf'); LoaderTool::downloadContent($contents, 'fichier.pdf');
Pour aller plus loin
Si vous utilisez le serveur Lighttpd pour votre application PHP, vous pouvez activer le support d'X-SendFile dans Lighttpd et configurer LoaderTool pour l'utiliser. Ajoutez simplement les lignes suivantes à votre app.yml :
all: ... loadertool: enable_xsendfile: true
Merci
Avec ta classe, 1 ligne et hop! magie! ;-)
Bravo!
remerciement
Un énorme bravo!!!
Super!
Après analyse, ça devrait fonctionner, mais malheureusement la classe ne focntionnera pas sans PHP >= 5.3 (fonctions Finfo).
Un grand merci !
" Le savoir n'est bon que s'il est partagé. "
Bonne continuation :)
Deprecated: Function split() is deprecated
"Deprecated: Function split() is deprecated ..."
Pour corriger cette erreur, il faut remplacer dans le fichier LoaderTool.class.php ( à la ligne 144 ) :
- list($mime_type_major, $mime_type_minor) = split('/', $mime_type);
par :
- list($mime_type_major, $mime_type_minor) = explode('/', $mime_type);
si cela peut aider quelqu'un :)
__mm_c(O_O)c_mm__
Ajouter la bibliothèque externe
Mais j'ai un problème lorsque je veux ajouter la classe au "lib",
je sais pas comment je peut l'ajouter au symfony 2.3 ??
Merci d'avance pour votre réponse :)
Que mettre dans la vue
Ajouter la bibliothèque externe
je sais pas comment je peut l'ajouter au symfony 2.3 !!
Merci d'avance pour votre réponse :)
Merci !
Merci pour cette classe qui me paraît fort intéressante !
Je vais de ce pas la regarder et la tester !
Keroth