2017-04-12 73 views
1

我的问题是在上传文件之前检索元数据。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 

我有一个实体MEDIA:

<?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(映射= “媒体”,fileNameProperty = “文件名”,ORIGINALNAME = “originalFileName”)

当提交我形式的这些值为'null':

使用params [“get_image_resultat_sans_cache2.php.jpeg”,null,“2017”执行'INSERT INTO media(file_name,original_file_name,updated_at)VALUES(?,?,?)'时发生异常-04-12 10:11:56“]:

我有这些问题与所有参数:

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

的UploadableField标注有几个选项。它们如下:

映射:必需,捆绑配置中指定的映射名称使用; fileNameProperty:必填,该属性将包含上传文件的名称; 大小:将包含上传文件的字节大小的属性; mimeType:将包含上传文件的MIME类型的属性; originalName:将包含上传文件的原始名称的属性。

我不明白我做错了什么......

这里是我的媒体(实体)的形式提交后:

媒体{#403▼ -id:空 -file :UploadedFile {#15▼ -test:false -originalName:“get_image_resultat_sans_cache2.php。JPEG” -mimeType: “图像/ JPEG” -size:203751 -error:0 路径: “/ 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个 烫发:0100600 所有者:1000 组:1000 类型: “文件” 可写:真 可读:真 可执行:假 文件:真 DIR:假 链接:假 } -FileName:空 -originalFileName:空

看来上传文件之前设置的元数据时,这是一个问题..

非常感谢...

+0

Symfony的版本:3.2.7 –

回答

2

您使用的是哪个版本的VichUploaderBundle?

注释的文档是指开发者主文档,而稳定版(1.5.3)不支持开箱即用的元数据注释。

您可以看到1.5.3版本中的Vich \ UploaderBundle \ Mapping \ Annotation \ UploadableField.php仅处理注释'映射'和'fileNameProperty'。

在dev-master中,它处理那些和大小,mimeType和originalName。

与VICH \ UploaderBundle \元\驱动程序\ AnnotationDriver

同样的事情,如果你想在1.5.3版本来实现这一点,你需要创建一个事件监听。

这里是由VICH触发事件:https://github.com/dustin10/VichUploaderBundle/blob/1.5.3/Event/Events.php

+0

您好,感谢的答案:) 我在实体手动设置我的属性没有监听器,它的工作完美。 因为fieldType( - > add('file',FileType :: class))包含我需要的全部内容。 –