Partage
  • Partager sur Facebook
  • Partager sur Twitter

Symfony 4 - LiipImagine - Bug d'affichage

Certaines images ne suivent pas la dimension demandée

    16 septembre 2019 à 22:08:43

    Hello tout le monde !

    Sur l'application que je développe avec Symfony 4, mes utilisateurs ont un avatar qu'ils peuvent upload grâce à VichUploader.

    Cet avatar, je suis censé l'afficher dans différentes pages, et donc avec des tailles différentes.

    Pour ça j'utilise le bundle LiipImagine. Donc pour l'instant je ne l'affiche que sur la page de profil.

    Mais il m'arrive quelque chose de très bizarre !

    Donc j'ai configuré LiipImagine comme ceci :

    # See dos how to configure the bundle: https://symfony.com/doc/current/bundles/LiipImagineBundle/basic-usage.html
    liip_imagine:
      # valid drivers options include "gd" or "gmagick" or "imagick"
      driver: "gd"
      filter_sets:
        cache: ~
    
        # the name of the "filter set"
        avatar_big:
          # adjust the image quality to 75%
          quality: 75
    
          # list of transformations to apply (the "filters")
          filters:
            # create a thumbnail: set size to 120x90 and use the "outbound" mode
            # to crop the image when the size ratio of the input differs
            thumbnail: { size: [120, 120], mode: outbound }
    

    C'est la config avatar_big pour l'affichage dans la page de profil.

    Alors un truc très bizarre :

    - J'upload un avatar, il respecte la taille demandée. (120x120)
    - Je veux faire un essai avec une autre taille donc je modifie en (90x90)
    - J'actualise la page, l'image ne change pas de dimensions.
    - Je change d'image, la nouvelle image prend les bonnes dimensions. (90x90)
    - Si je remets l'ancienne, elle reprend les anciennes dimensions (120x120)
    - J'ai beau vider le cache, changer d'image et supprimer l'ancienne de mes fichiers pour ensuite la ré-upload, elle va quand même reprendre les anciennes dimensions.

    Et ça, ça arrive pour toutes les images que j'upload ! Si j'en upload une NOUVELLE, elle va prendre les dimensions demandées, mais si je change les dimensions, alors dès que je remettrai l'image, elle gardera les anciennes dimensions, même si je vide le cache, si je supprime carrément l'image, si je fais une copie de l'image et que je la ré-upload. Rien n'y fait !

    Quelque chose me dit que ça vient de ma config LiipImagine, et particulièrement cet endroit :

    filter_sets:
        cache: ~

    Le cache ! Mais je vois pas ce que je pourrais mettre d'autre. Et de toute manière, j'ai déjà tenté de le vider le cache, donc je sais pas si ça vient de ça

    Voilà comment j'affiche l'image dans Twig :

    <img class="avatar_big" src="{{ vich_uploader_asset(user.avatar, 'imageFile') | imagine_filter('avatar_big') }}" alt="Avatar de {{user.fullName}}">
    


    Et mon entité Avatar même si ça ne doit pas venir de ça :

    <?php
    
    namespace App\Entity;
    
    use Serializable;
    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\HttpFoundation\File\File;
    use Vich\UploaderBundle\Mapping\Annotation as Vich;
    
    /**
     * @ORM\Entity(repositoryClass="App\Repository\AvatarRepository")
     * @Vich\Uploadable
     */
    class Avatar implements Serializable
    {
        /**
         * @ORM\Id()
         * @ORM\GeneratedValue()
         * @ORM\Column(type="integer")
         */
        private $id;
    
        /**
         * @ORM\Column(type="string", length=255, nullable=true)
         */
        private $imageName;
    
        /**
         * NOTE: This is not a mapped field of entity metadata, just a simple property.
         * 
         * @Vich\UploadableField(mapping="avatar", fileNameProperty="imageName", size="imageSize")
         * 
         * @var File
         */
        private $imageFile;
    
    
        /**
         * @ORM\Column(type="integer")
         *
         * @var integer
         */
        private $imageSize;
    
        /**
         * @ORM\OneToOne(targetEntity="App\Entity\User", inversedBy="avatar", cascade={"persist", "remove"})
         */
        private $user;
    
        /**
         * @ORM\Column(type="datetime", nullable=true)
         */
        private $updatedAt;
    
        public function getId(): ?int
        {
            return $this->id;
        }
    
        /**
         * If manually uploading a file (i.e. not using Symfony Form) ensure an instance
         * of 'UploadedFile' is injected into this setter to trigger the update. If this
         * bundle's configuration parameter 'inject_on_load' is set to 'true' this setter
         * must be able to accept an instance of 'File' as the bundle will inject one here
         * during Doctrine hydration.
         *
         * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $imageFile
         */
        public function setImageFile(?File $imageFile = null): void
        {
            $this->imageFile = $imageFile;
    
            if (null !== $imageFile) {
                // It is required that at least one field changes if you are using doctrine
                // otherwise the event listeners won't be called and the file is lost
                $this->updatedAt = new \DateTimeImmutable();
            }
        }
    
        public function getImageFile(): ?File
        {
            return $this->imageFile;
        }
    
        public function getImageName(): ?string
        {
            return $this->imageName;
        }
    
        public function setImageName(?string $imageName): self
        {
            $this->imageName = $imageName;
    
            return $this;
        }
    
        public function setImageSize(?int $imageSize): void
        {
            $this->imageSize = $imageSize;
        }
    
        public function getImageSize(): ?int
        {
            return $this->imageSize;
        }
    
        public function getUser(): ?User
        {
            return $this->user;
        }
    
        public function setUser(?User $user): self
        {
            $this->user = $user;
    
            return $this;
        }
    
        public function getUpdatedAt(): ?\DateTimeInterface
        {
            return $this->updatedAt;
        }
    
        public function setUpdatedAt(?\DateTimeInterface $updatedAt): self
        {
            $this->updatedAt = $updatedAt;
    
            return $this;
        }
    
        /** @see \Serializable::serialize() */
        public function serialize()
        {
            return serialize(array(
                $this->id,
                // $this->feuilleCongeFile,
            ));
        }
    
        /** @see \Serializable::unserialize() */
        public function unserialize($serialized)
        {
            list(
                $this->id,
                // $this->feuilleCongeFile,
            ) = unserialize($serialized, array('allowed_classes' => false));
        }
    }
    


    Quelqu'un a déjà eu ce problème ? C'est assez chiant... o_O

    EDIT: Après avoir regardé sur le net, j'ai appris que les images étaient sur /public/media/cache/[nomDuFiltre]/images/avatar

    Il y a un moyen pour que quand je supprime l'avatar, ça le supprime également de ce dossier ?

    -
    Edité par AgarioFR 16 septembre 2019 à 23:01:02

    • Partager sur Facebook
    • Partager sur Twitter
      16 septembre 2019 à 22:33:01

      salut,

      tu utilise un bundle pour l'upload?

      si oui pourquoi?

      vu que symfony 4 te permet de faire ça facilement sans l'aide d'un bundle d'ou ma question

      cf la doc..

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça

        16 septembre 2019 à 22:41:43

        Hey,

        Ouaip j'utilise VichUploaderBundle, car quand j'ai commencé Symfony, j'ai vu qu'il était hyper populaire et permettait pas mal de choses, donc j'ai trouvé ça plutôt cool !

        • Partager sur Facebook
        • Partager sur Twitter

        Symfony 4 - LiipImagine - Bug d'affichage

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown