Bonjour,

Cela fait plusieurs jours que je cherche a faire un multi upload d'image avec symfony 2.
Cependant rien ne va, même après plusieurs recherches, je tombe souvent sur du code dépassé.

j'ai deja essayer le bundle de punkave pour l'upload, mais je ne comprend pas comment l'utiliser, je trouve l'explication sur gît mal expliqué ou pas assez detaillé.

si quelqu'un connait la solution pour faire un multi upload d'image simplement ou une piste je suis preneur svp.
Actuellement j'ai une entité catégorie et une entité photo
donc une catégorie a plusieurs photo.
Je souhaite juste faire un champ file avec la propriété multiple et envoyer les photos.

Merci d'avance aux personnes qui prendront le temps de répondre a mon post.

3 réponses


Yentia
Auteur
Réponse acceptée

Salut,

En fait j'ai trouvé une solution il y a quelques jours. vue que tu dois faire la même chose, je vais poster ma solution peut être qu'elle te sera utile ou qu'elle sera utile a quelqu'un :) .

Pour reprendre ma situation et que toute le monde comprennent bien, j'ai une entity CategoriePhoto et une entity Photo
ce que je voulais faire c’était de pouvoir envoyer grâce à une champ file plusieurs photos d'un coup pour la même CategoryPhoto.
(du genre je mets 20 photos dans cette album), dans ce poste je n'affiche que le code pour gérer le multi-upload.

J'ai donc utilisé un transformer(convertisseur de données), voici mon code :

Dans mon formulaire :

$builder
            ->add(
                $builder->create('fileImg', 'file', 'data_class' => null,'multiple' => true,])
                ->addModelTransformer(new FilesTransformer()))

ici fileImg est un champ virtuel interprété par la classe Uplaodedfile de symfony dans mon entity Photo
on passe multiple a true
et on ajoute le modelTransformer avec la fonction que voici :

pour vous aidez à bien comprendre, voir la doc : doc-symfony-convertisseur-de-données

public function reverseTransform($files)
    {
        $photos = ];
        foreach($files as $file){
            $photo = new Photo();
            $photo->setFileImg($file);
            $photos] = $photo;
        }
        return $photos;
    }

Donc pour chacune des photos uploadé avec le champ fileImg, on crée une nouvelle entity Photo, puis on les retournes.

Dans mon controller , quand le form est valide:

$files = $form->get('fileImg')->getData();
                foreach($files as $file)
                {
                    $file->preUpload();
                    $file->upload();
                    $em->persist($file);
                    $em->flush($file);
                }

je récupère les entités, je les parcoures, pour ensuite Upload et les sauvegarder dans ma BDD.
( preUpload concerne le renommage des fichiers uploadé, voir la doc de symfony pour l'upload des fichiers, j'utilise les même méthode )

Voila j'espère que j'ai été clair et que cela pourra vous aider.

Salut,

Tu as regardé le MediaBundle ? Ecrit pour le projet CMF, il pourrait peut être te convenir... pas contre, c'est du dev/master :-/
Personnellement, je vais devoir faire la même chose que toi, mais je partais sur l'idée d'utiliser l'extension uploadable https://github.com/Atlantic18/DoctrineExtensions/blob/master/doc/uploadable.md ... Par contre pour le traitement des images ( genre filtres, recadrage, etc... ) je me suis pas encore penché dessus :)

Merci =) Cependant je te déconseille de faire un flush dans ton foreach :) ... D'un point de vue perfs c'est à proscrire ! :)