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
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...
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 ?
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 !
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.
Pas d'aide concernant le code par MP ni par mail, le forum est là pour ça