2013-04-22 3 views
6

Прошло некоторое время с тех пор, как я загрузил файлы с помощью Symfony2, и кажется, что все изменилось, следуйте руководству в How to handle File Uploads with Doctrine, но устарело и не работает.Symfony 2.2 загрузка файлов

, когда я пытаюсь связать образуют получить ошибку

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

это мой контроллер

/** 
* @Route("/upload", name="documento_upload") 
* @Method("POST") 
* @Template() 
*/ 
public function uploadAction(Request $request) 
{ 
    $portada = new Portada(); 
    $form = $this->buildUploadForm($portada); 
    $form->bind($request); 

    if ($form->isValid()) { 
     $portada->upload(); 
    } else { 
     throw new \Exception("Hay un error en el formulario"); 

    } 

    //... 
} 

моя сущность

<?php 

namespace MyName\MyBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\HttpFoundation\File\UploadedFile; 
use Symfony\Component\Validator\Constraints as Assert; 

class Portada 
{ 
    /** 
    * @Assert\File(maxSize="6000000") 
    */ 
    private $file; 

    public $path; 

    /** 
    * Sets file. 
    * 
    * @param UploadedFile $file 
    */ 
    public function setFile(UploadedFile $file = null) 
    { 
     $this->file = $file; 
    } 

    public function upload() 
    { 
     $this->path = $this->getFile()->getClientOriginalName(); 

     $this->getFile()->move(
      $this->getUploadRootDir(), 
      $this->path 
     ); 

     $this->file = null; 
    } 

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

    public function getAbsolutePath() 
    { 
     return null === $this->path 
      ? null 
      : $this->getUploadRootDir() . DIRECTORY_SEPARATOR . $this->path; 
    } 

    public function getWebPath() 
    { 
     return null === $this->path 
      ? null 
      : $this->getUploadDir() . DIRECTORY_SEPARATOR . $this->path; 
    } 

    protected function getUploadRootDir() 
    { 
     return __DIR__ . '/../../../../web/'. $this->getUploadDir(); 
    } 

    protected function getUploadDir() 
    { 
     return 'uploads/portada'; 
    } 
} 

ответ

15

Я забыл добавить ENCTYPE к моей форме после того, как добавлена ​​работа отлично

<form action="{{ path('documento_upload') }}" method="post" {{ form_enctype(upload_form) }}> 
    {{ form_widget(upload_form) }} 
    <button type="submit" class="btn btn-primary">Upload</button> 
</form> 
+0

+1 aaaaahhhhh .... thanks :) –

+0

можно ли это сделать без создания формы? – Gigala

+2

@ Гигала это возможно, но я не пытаюсь. проверьте '$ this-> getRequest() -> files', которые возвращают FileBag, и вы можете проверить, как перемещаться с помощью форм использования – rkmax

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