Symfony 2:上传文件并保存为blob

时间:2014-08-10 13:13:04

标签: php symfony doctrine blob

我尝试使用表单和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'   不允许

2 个答案:

答案 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()是将文件内容读入字符串的首选方法。如果操作系统支持,它将使用内存映射技术来提高性能。