我尝试使用表单和Doctrine保存数据库中的图像。在我的实体中,我已经完成了这个:
/**
* @ORM\Column(name="photo", type="blob", nullable=true)
*/
private $photo;
private $file;
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function upload()
{
if (null === $this->file) {
return;
}
$this->setPhoto(file_get_contents($this->getFile()));
}
我还在表单类型中添加了这个:
->add('file', 'file')
但我上传文件时收到此错误:
序列化' Symfony \ Component \ HttpFoundation \ File \ UploadedFile' 不允许
答案 0 :(得分:8)
您必须将图像文件内容保存为二进制文件
public function upload()
{
if (null === $this->file) {
return;
}
//$strm = fopen($this->file,'rb');
$strm = fopen($this->file->getRealPath(),'rb');
$this->setPhoto(stream_get_contents($strm));
}
UploadedFile
是一个扩展File
扩展SplFileInfo
SplFileInfo
具有返回临时文件名路径的函数getRealPath()
。
如果您不想将文件上传到服务器,请执行此操作follow these steps。
答案 1 :(得分:0)
问题在于,当Symfony上传文件时,它会将文件上传的属性分配给类型为UploadedFile
的对象。
所以$file
的类型为Symfony\Component\HttpFoundation\File\UploadedFile.
您收到的错误消息告诉您,您不能存储这种类型的对象-并且实际上您也不想这样做,您希望将带有路径的文件名传递给{{1} }。
因此,解决此问题所需要做的就是从对象访问文件的位置,如下所示:
file_get_contents()
请注意,已将对$this->setPhoto(file_get_contents($this->getFile()->getPathname()));
的调用添加到链的末尾。
此外,我肯定会保留getPathname()
,因为documentation指出:
file_get_contents()是将文件内容读入字符串的首选方法。如果操作系统支持,它将使用内存映射技术来提高性能。