2017-04-12 37 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))包含我需要的全部內容。 –