Bonjour,

J'ai suivi la formation Symfony avec succès mais je demandais comment faire pour rédimensionner après upload l'image de manière permanente : Utiliser le filtre avec LiipImage mais cette fois enregistrer la photo originale au même emplacement mais cette fois rédimensionner (histoire de réduire sa taille) vu qu'on permet déjà à l'utilisatuer d'uploader jusqu'à 10Mb de taille de photo.
Ainsi j'ai un peu cherché mais sans succès cette fois, avec l'idée des événéments PostUpload de VichUploader.
Mais je pensais quelque chose comme

Ce que je fais

public function new(Request $request)
    {
        $post = new Post();
        $form = $this->createForm(PostType::class, $post);

        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $this->em->persist($post);
            $this->em->flush();
            foreach ($post->getPictures() as $picture) {
                $picture->getFilename();
                // Une fois on a le chemin pour chaque image, appliquer maintenant le filtre et sauvegarder la nouvelle image
                // Code qui me fait défaut
            }

            $this->addFlash('success', 'Elément bien créé avec succès');

            return $this->redirectToRoute('admin.post.index');
        }

        return $this->render('admin/post/new.html.twig', [
            'post' => $post,
            'form' => $form->createView()
        ]);
    }

Merci de bien vouloir nous aider, nous chechons au fait comment compresser notre image qui peut avois jusqu'à 10Mb à 150Kb par exemple.

3 réponses


jobson
Auteur
Réponse acceptée

J'ai un peu fouillé et j'ai finalement opté pour InterventionImage qui me permet de redimensionner et reécrire une image, certes les uns me diront c'est un bundle de trop, mais vu que je n'ai pas trouvé de solution jusque là, pas de choix.
Pourquoi ceci, juste pour permettre à l'utilisateur d'uploader une image de 8Mb (5472 3648) qu'on ne va pas se permettre de grader sur le site et rester avec un 768 486 de 150Kb.

Pour ceux-là qui seraient intéressés, dans mon Controller après avoir uploadé l'image, je redimensionne toutes les images uploadée

public function edit(Post $post,Request $request)
    {
        $form = $this->createForm(PostType::class, $post);
        $form->handleRequest($request);
        if ($form->isSubmitted() && $form->isValid()) {
            $this->em->flush();
            $pics = [];
            foreach ($post->getPictures() as $picture) {
                $targetPath = 'media/posts/' .  $picture->getFileName();
                $pics[] = $targetPath;
                $this->resizeImage($targetPath);
            }
            dump($pics);
            $this->addFlash('success', 'Elément bien modifié avec succès');
            return $this->redirectToRoute('admin.post.index');
        }
        return $this->render('admin/post/edit.html.twig', [
            'post' => $post,
            'form' => $form->createView()
        ]);
    }

    private function resizeImage($targetPath)
    {
        $manager = new ImageManager(['driver' => 'gd']);
        $manager->make($targetPath)->widen(768, function ($constraint) {
            $constraint->upsize();
        })->save($targetPath);
    }

Et si quelqu'un peut améliorer l'idée ou propser, je serai toujours attentif, Merci :)

Hello @jobson,

C'est dans la doc : https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/form/vich_image_type.md

Il faut utiliser l'option "imagine_pattern" dans ton form type d'upload. Ca va directement redimensionner l'image et la placer dans le cache de Liip Imagine.

jobson
Auteur

Merci bien Digivia, Mais je rencontre quelques erreurs :
Dans mon PostType, quand je change le FileType:class en VichImageType:class j'ai une exception NotUploadableException sur Post
Au fait on a fait une relation avec l'entité Picture qui se charge maintenant des images et en essayant de trouver une issue, celle-ci me semble bien loin.

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('category', EntityType::class, [
                'class' => Category::class,
                'required' => true,
                'choice_label' => 'title'
            ])
            ->add('pictureFiles', VichImageType::class, [
                'required' => false,
                'imagine_pattern' => 'large',
            ])
            ->add('content')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Post::class,
        ]);
    }
}

Et l'entite Picture

/**
 * @ORM\Entity(repositoryClass="App\Repository\PictureRepository")
 * @Vich\Uploadable()
 */
class Picture
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @ORM\Column(type="string", length=255)
     */
    private $filename;

    /**
     * @var File|null
     * @Vich\UploadableField(mapping="post_image", fileNameProperty="filename")
     */
    private $imageFile;

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\Post", inversedBy="pictures")
     * @ORM\JoinColumn(nullable=false)
     */
    private $post;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getFilename(): ?string
    {
        return $this->filename;
    }

    public function setFilename(?string $filename): self
    {
        $this->filename = $filename;

        return $this;
    }

    /**
     * Get the value of imageFile
     *
     * @return  File|null
     */ 
    public function getImageFile()
    {
        return $this->imageFile;
    }

    /**
     * Set the value of imageFile
     *
     * @param  File|null  $imageFile
     *
     * @return  self
     */ 
    public function setImageFile($imageFile): self
    {
        $this->imageFile = $imageFile;
        return $this;
    }

    public function getPost(): ?Post
    {
        return $this->post;
    }

    public function setPost(?Post $post): self
    {
        $this->post = $post;

        return $this;
    }
}

Et je ne sais pas si c'est le fichier uploadé qui sera automatiquement redimensionner ou ça va créer un autre en cache
Encore Merci