Outils personnels
Vous êtes ici : Accueil Symfony LoaderTool : une classe Symfony spécialisée dans le téléchargement
Actions sur le document
  • Send this page to somebody
  • Print this page
  • Add Bookmarklet

LoaderTool : une classe Symfony spécialisée dans le téléchargement

Par Pierre-Yves Landuré - Dernière modification 20/09/2011 15:26

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 :

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

 

Attachements

Merci !

Posté par Keroth le 24/06/2009 07:15
Bonjour !

Merci pour cette classe qui me paraît fort intéressante !
Je vais de ce pas la regarder et la tester !

Keroth

Merci

Posté par John le 28/10/2009 13:23
Merci bcp! Je galère depuis ce matin pour forcer le téléchargement d'un fichier sous symfony ... impossible.

Avec ta classe, 1 ligne et hop! magie! ;-)

Bravo!

remerciement

Posté par toofff le 02/04/2010 15:19
Merci beaucoup pour ta classe, elle est vraiment magique que ça soit pour symfony ou pour un développement plus simple.

Un énorme bravo!!!

Super!

Posté par Ludo le 09/02/2011 17:42
Est-ce que ça fonctionne avec Symfony 1.4?
Après analyse, ça devrait fonctionner, mais malheureusement la classe ne focntionnera pas sans PHP >= 5.3 (fonctions Finfo).

Un grand merci !

Posté par Tadpole le 28/04/2011 09:33
Un grand merci pour le partage d'une classe de ce type,

" Le savoir n'est bon que s'il est partagé. "

Bonne continuation :)

Deprecated: Function split() is deprecated

Posté par Tadpole le 28/04/2011 10:15
Une erreur peut intervenir lors de l'utilisation de la classe du type :
"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

Posté par Abde le 21/05/2015 15:32
Merci pour votre sujet.
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

Posté par oumda le 01/07/2011 10:52
Que dois-je mettre dans la vue pour avoir un lien vers le téléchargement

Ajouter la bibliothèque externe

Posté par Abde le 21/05/2015 15:34
Salùt, j'ai un problème lorsque je veux ajouter la bibliothèque (ou bien la classe LoaderTool.class.php)
je sais pas comment je peut l'ajouter au symfony 2.3 !!
Merci d'avance pour votre réponse :)


Réalisé avec Plone

Ce site respecte les normes suivantes :

Wikio