VichUploader symfony 4 не загружает изображение

Я пытаюсь загрузить изображение по пути: {project} / public / img / circuitits, используя vichuploaderBundle.

Я следил за его документацией на github: https://github.com/dustin10/VichUploaderBundle/blob/master/docs/index.md

Ситуация такова: у меня есть форма с VichImageType, и когда я отправляю указанную форму с изображением, я получаю следующее:

thumbnailFile: Symfony\Component\HttpFoundation\File\UploadedFile {#91 ▼
    -test: false
    -originalName: "meme.jpg"
    -mimeType: "image/jpeg"
    -error: 0
    path: "/tmp"
    filename: "phpomKjXK"
    basename: "phpomKjXK"
    pathname: "/tmp/phpomKjXK"
    extension: ""
    realPath: "/tmp/phpomKjXK"
    aTime: 2020-11-26 16:22:10
    mTime: 2020-11-26 16:22:10
    cTime: 2020-11-26 16:22:10
    inode: 262126
    size: 79694
    perms: 0100600
    owner: 1000
    group: 1000
    type: "file"
    writable: true
    readable: true
    executable: false
    file: true
    dir: false
    link: false
  }

Я использую это отображение (vich_uploader.yaml):

vich_uploader:
    db_driver: orm

    mappings:
        circuits:
            uri_prefix: /img/circuits
            upload_destination: '%kernel.project_dir%/public/img/circuits'
            namer: Vich\UploaderBundle\Naming\SmartUniqueNamer


Вот фрагменты кода, связанные с изображением из моей сущности:

/**
 * @ORM\Entity(repositoryClass=CircuitRepository::class)
 * @Vich\Uploadable
 */
class Circuit
{
/**
     * @ORM\Column(type="string", length=255)
     */
    private $thumbnail;

    /**
     * @Vich\UploadableField(mapping="circuits", fileNameProperty="thumbnail")
     * @var File|null
     */
    private $thumbnailFile;
    /**
     * @var \DateTime
     */
    private $updated_at;

    public function getThumbnail(): ?string
    {
        return $this->thumbnail;
    }

    public function setThumbnail(string $thumbnail): self
    {
        $this->thumbnail = $thumbnail;

        return $this;
    }


    /**
     * @return File
     */
    public function getThumbnailFile(): ?File
    {
        return $this->thumbnailFile;
    }

    /**
     * @param File $thumbnailFile
     */
    public function setThumbnailFile(?File $thumbnailFile): self
    {
        $this->thumbnailFile = $thumbnailFile;
        if ($this->thumbnailFile instanceof UploadedFile)
            $this->updated_at = new \DateTime('now');
        return $this;
    }

}

Наконец, вот часть моей формы, которая обрабатывает ввод изображения:

->add('thumbnailFile', VichImageType::class, [
                'label' => 'Vignette',
                'allow_delete' => false,
                'download_uri' => false,
                'image_uri' => false,
                'required' => true,
            ])

Кто-нибудь знает, почему файлы, которые я пытаюсь загрузить, не сохраняются в моей папке / public / img / circuit?

Спасибо.

РЕДАКТИРОВАТЬ: Когда я создаю свой объект, изображение загружается и сохраняется в порядке, но однажды я пытаюсь изменить его и переопределить существующее изображение объекта другим, он удаляет его из объекта, но не загружает новый.


person DeimosPhx    schedule 26.11.2020    source источник
comment
Вы убедились, что путь существует и доступен для записи?   -  person Arleigh Hix    schedule 26.11.2020
comment
Это я только что дважды проверил   -  person DeimosPhx    schedule 27.11.2020
comment
Ваш $updated_at не является столбцом, я думаю, поэтому он не обновляется доктриной и, соответственно, не запускает слушателей vich_uploader.   -  person Flash    schedule 01.12.2020
comment
@Flash, который может быть правильным, но после расследования он не попал в $ updated_at   -  person DeimosPhx    schedule 02.12.2020


Ответы (1)


Я нашел обходной путь.

Это кажется странным, но по некоторым причинам это работает. Мне нужно было при обработке отправки формы установить значение миниатюры (переменная имени изображения) вручную с помощью собственного геттера. И теперь я могу заменить одно изображение другим.

$circuit->setThumbnail($circuit->getThumbnail());
person DeimosPhx    schedule 27.11.2020
comment
У меня была такая же ошибка с VichUploader, когда я просматривал документацию (symfony.com/doc/2.x/bundles/EasyAdminBundle/integration/) вы можете отметить это // VERY IMPORTANT: // 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. Таким образом, вы должны использовать сеттер для загрузки работ, иначе файл будет потерян. - person Lounis; 27.11.2020
comment
да, у меня было обновление поля DateTime, но как-то не сработало в моем случае, я считаю - person DeimosPhx; 27.11.2020