Я остановлен этой ошибкой:
Исправляемая фатальная ошибка: аргумент 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
линия 157
В моей сущности у меня есть сеттеры и геттеры для File. Я использовал этот метод для загрузки файла: ЭТОТ
И была проблема с разрешением для папки 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) }}
это также защитит вас от атак CSR