2014-10-11 4 views
2

Я пытаюсь загрузить файл на основе VichUploaderBundle. Я получил эту ошибку при выполнении его:ContextErrorException при загрузке файла через VichUploaderBundle

ContextErrorException: Catchable Fatal Error: Argument 1 passed to Minn\AdsBundle\Entity\MotorsAdsFile::setFile() must be an instance of Symfony\Component\HttpFoundation\File\File, string given,... 

Я знаю, что эта проблема является классом данного аргумента в методе SetFile(). Но это я нашел в документации по github.

Итак, это то, что я сделал & Надеюсь, что решит проблему!

конфигурации пучка

vich_uploader: 
    db_driver: orm # or mongodb or propel or phpcr 
    mappings: 
     motors_files: 
      uri_prefix:   /files/motors 
      upload_destination: %kernel.root_dir%/../web/files/motors 
      namer: vich_uploader.namer_origname 
      delete_on_remove: true 

Определение моей сущности Файл

<?php 

namespace Minn\AdsBundle\Entity; 

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

/** 
* @ORM\Entity 
* @Vich\Uploadable 
*/ 
class MotorsAdsFile { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @Assert\File(
    *  maxSize="5M", 
    *  mimeTypes={"image/png", "image/jpeg"} 
    *) 
    * @Vich\UploadableField(mapping="motors_files", fileNameProperty="file") 
    * note: This is not a mapped field of entity metadata, just a simple property. 
    * @var File $file 
    */ 
    protected $file; 

    /** 
    * @ORM\Column(type="string", length=255, name="name") 
    * @var string $name 
    */ 
    protected $name; 

    /** 
    * 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 $file 
    */ 
    public function setFile(File $file) { 
     $this->file = $file; 
    } 

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

    /** 
    * @param string $name 
    */ 
    public function setName($name) { 
     $this->name = $name; 
    } 

    /** 
    * @return string 
    */ 
    public function getName() { 
     return $this->name; 
    } 

} 

Twig часть для формы

<form action="{{ path('minn_ads_motors_test6') }}" {{ form_enctype(form) }} method="POST"> 
    {{ form_widget(form) }} 
    <div> 
     <input type="submit" value="do it with VICH" /> 
    </div> 
</form> 

мое действие() в мой контроллер

public function motorstest6Action(Request $request) { 
    $document = new MotorsAdsFile(); 
    $form = $this->createFormBuilder($document) 
      ->add('name') 
      ->add('file') 
      ->getForm(); 

    $form->handleRequest($request); 

    if ($form->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $em->persist($document); 
     $em->flush(); 

     return $this->redirect($this->generateUrl('minn_ads_default_index')); 
    } 
    return $this->render('MinnAdsBundle:Motors:adddoc1.html.twig', array(
       'form' => $form->createView())); 
} 

ответ

2

Ваш объект не настроен должным образом. Для того, чтобы этот пакет работал, объект должен иметь два поля для представления файла: один для хранения объекта File (не отображаемый по доктрине), а другой для хранения его имени (в виде строки, отображаемой по доктрине). У вашего объекта только первое поле.

Вот как вы должны были определить его:

<?php 

namespace Minn\AdsBundle\Entity; 

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

/** 
* @ORM\Entity 
* @Vich\Uploadable 
*/ 
class MotorsAdsFile { 

    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    public $id; 

    /** 
    * @Assert\File(
    *  maxSize="5M", 
    *  mimeTypes={"image/png", "image/jpeg"} 
    *) 
    * @Vich\UploadableField(mapping="motors_files", fileNameProperty="filename") 
    * note: This is not a mapped field of entity metadata, just a simple property. 
    * @var File $file 
    */ 
    protected $file; 

    /** 
    * @ORM\Column(type="string", length=255, name="filename") 
    * @var string $filename 
    */ 
    protected $filename; 

    /** 
    * @ORM\Column(type="string", length=255, name="name") 
    * @var string $name 
    */ 
    protected $name; 

    /** 
    * 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 $file 
    */ 
    public function setFile(File $file) { 
     $this->file = $file; 
    } 

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

    /** 
    * @param string $filenname 
    */ 
    public function setFilename($filename) { 
     $this->filename = $filename; 
    } 

    /** 
    * @return string 
    */ 
    public function getFilename() { 
     return $this->file; 
    } 

    /** 
    * @param string $name 
    */ 
    public function setName($name) { 
     $this->name = $name; 
    } 

    /** 
    * @return string 
    */ 
    public function getName() { 
     return $this->name; 
    } 
} 

Обратите внимание на новом filename поля и новое значение для filenameProperty опции в UploadableField аннотации.

+0

молодец друг !!! :) –

0

Вы сделали! Теперь создайте форму с полем imageFile, которое использует тип файла .

https://github.com/dustin10/VichUploaderBundle/blob/master/Resources/doc/usage.md#that-was-it

Таким образом, вы можете попробовать это

 ->add('file', 'file') 

Вместо

 ->add('file') 

Как ваше поле не отображается в FormBuilder, вероятно, ставит его в качестве строки по умолчанию ,

+0

У меня все еще есть такая же проблема! –

Смежные вопросы