Пакет загрузки Synfony 3 + Vich - не удалось установить метаданные перед загрузкой файла

Моя проблема заключается в получении метаданных перед загрузкой файла.

Мой конфигурационный файл:

vich_uploader:
    db_driver: orm
    mappings:
        media:
            uri_prefix:         /uploads/
            upload_destination: '%kernel.root_dir%/../web/uploads'
            inject_on_load:     false
            delete_on_update:   true
            delete_on_remove:   true

У меня есть сущность СМИ:

<?php

    namespace AppBundle\Entity;

    use Doctrine\ORM\Mapping as ORM;
    use Symfony\Component\HttpFoundation\File\File;
    use Vich\UploaderBundle\Mapping\Annotation as Vich;

    **
     * @ORM\Entity
     * @Vich\Uploadable
     */
    class Media
    {
        /**
         * @ORM\Id
         * @ORM\Column(type="integer")
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;

        /**
         *
         * @Vich\UploadableField(mapping="media", fileNameProperty="fileName",originalName="originalFileName")
         *
         * @var File
         */
         private $file;

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

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

         /**
          * @ORM\Column(type="datetime")
          */
         private $updatedAt;

         /**
          * @param File|\Symfony\Component\HttpFoundation\File\UploadedFile $file
          *
          * @return Media
          */
         public function setFile(File $file = null)
         {
             $this->file = $file;

             if ($file) {
                 $this->updatedAt = new \DateTimeImmutable();
             }

             return $this;
         }

         /**
          * @return File|null
          */
         public function getFile()
         {
             return $this->file;
         }

         /**
          * @param string $fileName
          *
          * @return Media
          */
         public function setFileName($fileName)
         {
             $this->fileName = $fileName;

             return $this;
         }

         /**
          * @return string|null
          */
         public function getFileName()
         {
             return $this->fileName;
         }

         /**
          * Get id
          *
          * @return integer
          */
         public function getId()
         {
             return $this->id;
         }

         /**
          * Set updatedAt
          *
          * @param \DateTime $updatedAt
          *
          * @return Media
          */
         public function setUpdatedAt($updatedAt)
         {
             $this->updatedAt = $updatedAt;

             return $this;
         }

         /**
          * Get updatedAt
          *
          * @return \DateTime
          */
         public function getUpdatedAt()
         {
             return $this->updatedAt;
         }

         /**
          * Set originalFileName
          *
          * @param string $originalFileName
          *
          * @return Media
          */
         public function setOriginalFileName($originalFileName)
         {
             $this->originalFileName = $originalFileName;

             return $this;
         }

         /**
          * Get originalFileName
          *
          * @return string
          */
         public function getOriginalFileName()
         {
             return $this->originalFileName;
         }
     }

А вот и мой контроллер:

   /**
     * Creates a new media entity.
     *
     * @Route("/new", name="media_new")
     * @Method({"GET", "POST"})
     *
     * @param Request $request
     *
     * @return \Symfony\Component\HttpFoundation\RedirectResponse|\Symfony\Component\HttpFoundation\Response
     */
    public function newAction(Request $request)
    {
        $media = new Media();
        $form = $this->createForm(MediaType::class, $media);

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {

            $em = $this->getDoctrine()->getManager();

            $em->persist($media);
            $em->flush();
            return $this->redirectToRoute(
                'media_list'
            );
        }

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

И моя форма:

    <?php
    /**
     * Created by PhpStorm.
     * User: rafael
     * Date: 4/10/17
     * Time: 12:46 PM
     */

    namespace AppBundle\Form;

    use AppBundle\Entity\Media;
    use AppBundle\Entity\MediaDescriptionHelper;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
    use Symfony\Component\Form\Extension\Core\Type\FileType;
    use Symfony\Component\Form\Extension\Core\Type\SubmitType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolver;

    class MediaType extends AbstractType
    {
        /**
         * @param FormBuilderInterface $builder
         * @param array $options
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
                ->add('file', FileType::class)
                ->add('save', SubmitType::class, [
                    'attr' => ['class' => 'btn-primary btn-block']
                ]);
        }

        /**
         * @param OptionsResolver $resolver
         */
        public function configureOptions(OptionsResolver $resolver)
        {
            $resolver->setDefaults(['data_class' => Media::class]);
        }
    }

Проблема заключается в отображении этих значений:

@Vich \ UploadableField (mapping = "media", fileNameProperty = "fileName", originalName = "originalFileName")

Когда я отправляю свою форму, эти значения равны нулю:

Возникла исключительная ситуация при выполнении 'INSERT INTO media (file_name, original_file_name, updated_at) VALUES (?,?,?)' С параметрами ["get_image_resultat_sans_cache2.php.jpeg", null, "2017-04-12 10:11:56"]:

У меня есть эти проблемы со всеми параметрами:

( https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/usage.md)

У аннотации UploadableField есть несколько опций. Они заключаются в следующем:

mapping: обязательно, имя отображения, указанное в конфигурации пакета для использования;fileNameProperty: обязательно, свойство, которое будет содержать имя загруженного файла;размер: свойство, которое будет содержать размер в байтах загружаемого файла;mimeType: свойство, которое будет содержать тип mime загруженного файла;originalName: свойство, которое будет содержать оригинальное имя загруженного файла.

Я не вижу, что я сделал не так...

Вот мое медиа (лицо) после отправки формы:

Media {# 403 ▼ -id: null -file: UploadedFile {# 15 ▼ -test: false -originalName: "get_image_resultat_sans_cache2.php.jpeg" -mimeType: "image / jpeg" -size: 203751 -error: 0 path: " / tmp "имя файла: "php9xsTdF"базовое имя: "php9xsTdF"имя пути: "/tmp/php9xsTdF"расширение: "" realPath: "/tmp/php9xsTdF" aTime: 2017-04-12 10:11:56 mTime: 2017-04-12 10:11:56 cTime: 2017-04-12 10:11:56 inode: 6160452 размер: 203751 perms: 0100600 владелец: 1000 группа: 1000 тип: "файл" доступный для записи: true читаемый: true исполняемый файл: false файл: true dir: ложная ссылка: false } -fileName: null -originalFileName: null

Кажется, это проблема, когда установить метаданные перед загрузкой файла...

Заранее большое спасибо...

1 ответ

Решение

Какую версию VichUploaderBundle вы используете?

Документация для аннотаций относится к dev-master, тогда как стабильная (1.5.3) не поддерживает аннотации для метаданных "из коробки".

Вы можете видеть, что Vich\UploaderBundle\Mapping\Annotation\UploadableField.php в версии 1.5.3 обрабатывает только аннотации 'mapping' и 'fileNameProperty'.

Находясь в dev-master, он обрабатывает их и size, mimeType и originalName.

То же самое с Vich\UploaderBundle\Metadata\Driver\AnnotationDriver

Если вы хотите добиться этого в версии 1.5.3, вам нужно создать eventListener.

Вот событие, вызванное Vich: https://github.com/dustin10/VichUploaderBundle/blob/1.5.3/Event/Events.php

Другие вопросы по тегам