Navigation

Related Articles

Back to Latest Articles

Upload de fichier avec Symfony


thomas
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

Show Comments (9)

Comments

  • Olivier

    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

    • Article Author
  • thomas

    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.

    • Article Author
  • Olivier

    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

    • Article Author
  • damien

    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?

    • Article Author
  • damien

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

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

    Cordialement, Damien

    • Article Author
  • thomas

    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)

    • Article Author
  • Renaud

    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) ?

    • Article Author
  • thomas

    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();

    • Article Author
  • Tadpole

    Un grand MERCI !

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

    bonne continuation

    • Article Author

Recevez nos articles