Upload de fichier avec Symfony

Un petit post pour expliquer l’upload de fichier via symfony 1.2 et surtout la gestion du nom du fichier uploadé.

Pour uploader un fichier rien de plus simple, et tout est expliqué ici: http://www.symfony-project.org/jobeet/1_2/Doctrine/en/10 le schema.yml

Image:
  tableName: table_image
  columns:
    name: { type: string(255), notnull: true }
    image: { type: string(255) }

dans le fichier ImageForm.class.php, on modifie le widget pour lui dire que c’est un input File, et le validator qui correspond

class ImageForm extends BaseImageForm
{
  public function configure()
  {
    $this->widgetSchema['image'] = new sfWidgetFormInputFile(array(
                                        'label' => 'Image',
                                         ));

    $this->validatorSchema['image'] = new sfValidatorFile(array(
                                        'required' => true,
                                        'path' => sfConfig::get('sf_upload_dir').'/images',
                                        'mime_types' => 'web_images',
                               ));

  }
}

Donc à partir de maintenant dans mon backend, je peux uploader les images MAIS elles sont renommées en md5.extension, ce qui est bien, mais pas top. Pour y remedier, je vais dans le model Image.class.php

class Image extends BaseImage
{
  public function generateImageFilename(sfValidatedFile $file)
  {
    return Sanitize::stripText($this->name).'_logo'.$file->getOriginalExtension();
  }
}

en créant une fonciton generateMonChampsFilename(), je peux choisir le nomdu me fichier uploadé, fichier qui passe en parametre de cette fonciton. Ici je lui donne la valeur de mon champs name. Pour l’API correspondante: http://www.symfony-project.org/api/1_2/sfValidatedFile

Laisser un commentaire

Besoin d’un coup de main ?

Prenez rendez vous au tél avec nous pour discuter de votre projet.
C'est gratuit :)

Prenez RDV gratuitement (30 min)

Aucun commentaire

  1. Bonjour,

    C’est enfin une source sur une partie obscure de symfony.
    Seriez vous comment fait-on pour faire la même chose dans l’admin générator qui génère un nom de fichier en MD5.

    Cordialement Olivier

  2. Bonjour,

    en principe le fait d’écrire la fonction generateImageFilename va surcharger la fonction par défaut (le fameux md5 ). Donc vu que c’est écrit sur l’objet ca doit marcher aussi bien dans le front que dans l’admin.

  3. Bonjour,

    trop heureux d’avoir une réponse, j’ai essayé mais cela ne fonctionne pas. Par contre, je vais regarder si je n’ai pas mal fait les choses car je n’ai pas implémenter la partie validator que vous précisez. si cela fonctionne , je reviendrais le dire.

    cordialement olivier

  4. Cela ne fonctionne pas pour moi:

    Fatal error: Class ‘Sanitize’ not found in C:\www\symf\test\lib\model\Photo.php on line 13

    Y’a t’il un autre moyen?

  5. C\\\’est bon, j\\\’ai trouvé, ma fonction ressemble à cela maintenant:

    public function generateDescriptionFilename(sfValidatedFile $file)
    {
    return $file->getOriginalName();
    }
    }

    Cordialement, Damien

  6. Bonjour,

    dans ma function generateImageFilename(sfValidatedFile $file) je fais appel à la méthode stripText() de l’objet Sanitize :
    Sanitize::stripText($text)
    Or cette fonction n’est pas par défaut dans symfony, elle permet simplement de faire un slugify.
    Symfony à sa propre fonction que l’on peut appeler de la sorte :
    Doctrine_Inflector::urlize($text)

  7. Bonjour,

    En suivant pas à pas le tutoriel Jobeet je n\’ai pas eut trop de soucis avec l\’upload en lui-même. Cependant j\’aimerai moi aussi que mon nom de fichier soit composé de certaines informations provenant de ma table ($this->name dans l\’exemple). Mais si je change le \’name\’ et le fichier en même temps lors d\’une édition le nom du nouveau fichier n\’est pas généré avec la nouvelle valeur de \’name\’ … et je ne parle pas de la création. Y a-t-il un moyen avec Symfony de gérer tout cela en piochant dans les informations saisies dans le formulaire ? Ou est-ce que je dois surcharger ma méthode save en y mettant un rename du fichier (un peu barbare à mon goût alors qu\’il y a tant d\’outils à disposition) ?

  8. Bonjour,

    Le probleme c’est que lorsque l’on sauvegarde le formulaire, il upload les fichiers et n’a pas accès aux nouvelles données.
    Pour y remédier on peut lui faire passer la donnée voulue juste avant de faire la sauvegarde:
    $form->bind($request->getParameter($form->getName());
    if($form->isValid())
    {
    $form->getObject()->setName($form->getValue(‘name’));
    $form->save();
    }
    Donc avec cette phrase:
    $form->getObject()->setName($form->getValue(‘name’));
    on renseigne la valeur name de notre objet.
    et logiquement dans le
    generateDescriptionFilename($file){}
    on a maintenant accès à $this->getName();

  9. Un grand MERCI !

    C\’est grâce a des gens comme vous que l\’on avance à grands pas 🙂

    bonne continuation

Laisser un commentaire

Voir l’étude de cas
Lire l’article