Я был остановлен этой ошибкой:
Catchable Fatal Error: аргумент 1, переданный Joker \ CoreBundle \ Entity \ Incidentfile :: setFile () должен быть экземпляром Symfony \ Component \ HttpFoundation \ File \ UploadedFile, строка, вызывается в / Applications / MAMP / htdocs / joker-repo /vendor/symfony/symfony/src/Symfony/Component/Form/Util/PropertyPath.php в строке 538 и определен в /Applications/MAMP/htdocs/joker-repo/src/Joker/CoreBundle/Entity/Incidentfile.php line 157
В моем сущности у меня есть сеттеры и геттеры для Файла. Я использовал этот метод для загрузки файла: ЭТО
И была проблема разрешения для папки upload_images, но после того, как я решил, все работало нормально, но теперь что-то пошло не так.
Вот сущность
/** * Incidentfile * * @ORM\Table() * @ORM\Entity(repositoryClass="Joker\CoreBundle\Entity\IncidentfileRepository") * @ORM\HasLifecycleCallbacks */ class Incidentfile { // // /** // * @ORM\ManyToOne(targetEntity="Incidentlist", inversedBy="ListFiles") // * @ORM\JoinColumn(name="IncidentListId", referencedColumnName="id") // */ // protected $FileList; /** * @var integer * * @ORM\Column(name="id", type="integer") * @ORM\Id * @ORM\GeneratedValue(strategy="AUTO") */ private $id; /** * @var \DateTime * * @ORM\Column(name="createdat", type="datetime") */ private $createdat; /** * Image path * * @var string * * @ORM\Column(type="text", length=255, nullable=false) */ protected $path; /** * Image file * * @var File * * @Assert\File( * maxSize = "5M", * mimeTypes = {"image/jpeg", "image/gif", "image/png", "image/tiff"}, * maxSizeMessage = "The maxmimum allowed file size is 5MB.", * mimeTypesMessage = "Only the filetypes image are allowed." * ) */ protected $file; /** * Get id * * @return integer */ public function getId() { return $this->id; } /** * Set createdat * * @param \DateTime $createdat * @return Incidentfile */ public function setCreatedat($createdat) { $this->createdat = $createdat; return $this; } /** * Get createdat * * @return \DateTime */ public function getCreatedat() { return $this->createdat; } /** * Called before saving the entity * * @ORM\PrePersist() * @ORM\PreUpdate() */ public function preUpload() { if (null !== $this->file) { // do whatever you want to generate a unique name $filename = sha1(uniqid(mt_rand(), true)); $this->path = $filename.'.'.$this->file->guessExtension(); } } /** * Called before entity removal * * @ORM\PreRemove() */ public function removeUpload() { if ($file = $this->getAbsolutePath()) { unlink($file); } } public function getWebPath() { return null === $this->path ? null : $this->getUploadDir().'/'.$this->path; } /** * Called after entity persistence * * @ORM\PostPersist() * @ORM\PostUpdate() */ protected function getUploadRootDir() { // the absolute directory path where uploaded // documents should be saved return __DIR__.'/../../../../web/'.$this->getUploadDir(); } protected function getUploadDir() { // get rid of the __DIR__ so it doesn't screw up // when displaying uploaded doc/image in the view. return 'uploaded_images'; } /** * Sets file. * * @param UploadedFile $file */ public function setFile(UploadedFile $file = null) { if (null === $file) { return; } $this->file = $file; if(in_array($file->getMimeType(),array("image/jpeg", "image/gif", "image/png", "image/tiff"))){ $filename=rand(100000,1000000).'_'.$file->getClientOriginalName(); $file->move($this->getUploadRootDir(),$filename ); $this->path =$filename; $this->file = null; } else $this->path=null; } /** * Get file. * * @return UploadedFile */ public function getFile() { return $this->file; } public function upload() { // the file property can be empty if the field is not required if (null === $this->getFile()) { return; } $file=$this->getFile(); $filename=rand(100000,1000000).'_'.$file->getClientOriginalName(); // we use the original file name here but you should // sanitize it at least to avoid any security issues // move takes the target directory and target filename as params $file->move($this->getUploadRootDir(),$filename ); // set the path property to the filename where you've saved the file $this->path =$filename; // clean up the file property as you won't need it anymore $this->setFile(null); } /** * Set path * * @param string $path * @return Incidentfile */ public function setPath($path) { $this->path = $path; return $this; } /** * Get path * * @return string */ public function getPath() { return $this->path; } /** * Set FileList * * @param \Joker\CoreBundle\Entity\Incidentlist $fileList * @return Incidentfile */ public function setFileList(\Joker\CoreBundle\Entity\Incidentlist $fileList = null) { $this->FileList = $fileList; return $this; } /** * Get FileList * * @return \Joker\CoreBundle\Entity\Incidentlist */ public function getFileList() { return $this->FileList; } }
И вот мой контролер:
public function TestAction(Request $request){ $incfileRepo = new Incidentfile(); $formfile = $this->createForm(new IncfileType(), $incfileRepo); if ($request->isMethod('POST')) { $formfile->bind($request); if ($formfile->isValid()) { $em = $this->getDoctrine()->getManager(); $em->persist($incfileRepo); $em->flush(); return $this->redirect($this->generateUrl('incident_show')); } } $spotEntity = $this->getCurrentSpot(); $sentryEntity = $this->getCurrentSentry(); $messagesCollection = $this->getDoctrine()->getRepository('JokerCoreBundle:Message')->findBy(array( 'spot' => $spotEntity, 'sentry' => $sentryEntity ), array( 'sent_date' => 'DESC' )); return $this->render('JokerAdminBundle:incidents:addfullform.html.twig', $this->getViewConstants(array( 'formfile'=>$formfile->createView(), 'spot' => $spotEntity, 'sentry' => $sentryEntity, 'messagesCollection' => $messagesCollection, ))); }
Форма в веточке:
<form action="" method="post"> {{ form_rest(formfile) }} <div class="singleTableForm"> <input style="float: left; margin-left: 338px; " type="submit" name="" class="button" value="Add" /> </div> </form>
Я узнал, что случилось. В ветке была проблема:
<form action="" method="post" {{ form_enctype(formfile) }}>
Просто добавьте **{{ form_enctype(formfile) }}**
Вы должны добавить аннотацию
/** * @ORM\PostPersist() * @ORM\PostUpdate() */ public function upload()
подробнее http://symfony.com/doc/current/cookbook/doctrine/file_uploads.html
И покажите код формы
UPD : лучший способ – использовать теги {{ form_start(form) }}
и {{ form_end(form) }}
он также защитит вас от атак csrf