Force-download avec Symfony


Samuel Breton
Force-download avec Symfony

Aujourd’hui, nous allons aborder quelque chose de simple et répandu sur la plupart des sites Internet de nos jours : le téléchargement de fichiers.

Bien sûr, il ne s’agit pas de permettre aux utilisateurs de télécharger votre dernier rush de photos nocturnes sous forme d’archive zip, ou encore les rapports de la dernière assemblée générale de votre association en PDF; car ceci ne nécessite en rien l’intervention de symfony.

Par contre, dès qu’une action doit être entreprise pour vérifier l’authenticité de l’utilisateur, ou ne serait-ce qu’une table de log pour savoir qui a téléchargé quel fichier, on va avoir besoin de symfony (à moins d’avoir envie de réinventer la roue).
(suite…)

Show Comments (8)

Comments

  • CpNForTehWin

    Merci pour l’astuce du readfile ainsi que le « session_write_close() », c’est bon à savoir ! ! !

    • Article Author
  • Nautilebleu

    J’utilise une méthode qui me semble moins compliquée, à moins que j’ai loupé quelque chose. En outre, spécifier le type MIME ‘application/force-download’ est dangeureux avec Mozilla, car FF update sa base des types MIME associés à une extension lorsque l’on télécharge un fichier et réutilise ce type MIME pour l’upload. Autrement dit, la prochaine fois qu’un utilisateur uploadera un fichier Zip par exemple, le type MIME ne sera pas application/zip mais application/force-download, ce qui peut poser des problèmes sur des serveurs qui utilise le type MIME envoyé par le client pour valider l’upload (c’est une mauvaise pratique mais ça arrive bien souvent.)

    A toutes fins utiles, un gist avec le code que j’utilise
    http://gist.github.com/482753

    • Article Author
  • Éric Rogé

    Pour info, tu peux éviter d’utiliser throw new sfStopException() en utilisant :
    – return sfView::NONE;
    – ou bien return $this->renderText()

    La doc se trouve là : http://www.symfony-project.org/gentle-introduction/1_4/en/06-Inside-the-Controller-Layer#chapter_06_sub_action_termination

    Sinon c’est un bon article, je me le garde de côté 🙂

    • Article Author
  • Guillaume BRETOU

    Même remarque que précédemment, il vaut mieux utiliser un

    return sfView::NONE;

    L’avantage c’est que tu n’as pas besoin de créer un template pour l’action.

    Pour éviter la debug bar, c’est comme tu l’as dis :

    sfConfig::set(‘sf_web_debug’, false)

    • Article Author
  • Nico D.

    Bonjour,
    très bon article !

    Pour ma part j’utilise ceci à la fin de l’action :
    return sfView::HEADER_ONLY;

    Pour ne pas avoir à générer les liens vers les fichiers par un link_to() et surtout pour sécuriser un peu plus (pas d’accès en lien direct par l’url), j’ai placé un htaccess dans /htdocs qui redirige tout seul vers l’action, exemple :

    RewriteRule software/(.*)$ /index.php/software/download/1 [L]

    • Article Author
  • Daniel

    Merci beaucoup pour ces explications.
    Cela m’a beaucoup aidé.

    • Article Author
  • vibby

    Juste Merci

    • Article Author
  • The b boy

    J’ai un problème très surprenant. Sur mon serveur de prod (hébergemet ovh) mon action de téléchargement marche très bien en dev (frontend_dev.php) mais pas en environnement de prod : ça m’affiche le fichier en mode de compatibilité (quirks)…

    Je m’arrache les cheveux merci de m\aider si vous avez une idée.

    • Article Author

Recevez nos articles