我面临一个奇怪的问题:当我想要更改用户的profil的图片时(使用Symfony2),上传文件的功能不是调用,因此,我的图片不会更改...但是,当我创建用户(第一次)时,会调用该函数并且图片上传得很好。
这是我的代码:
查看:
<div class="btn btn-default image-preview-input">
<span class="glyphicon glyphicon-folder-open"></span>
<span class="image-preview-input-title">Choisir une photo de profil</span>
{{ form_widget(form.logo) }}
</div>
实体:
/**
* @Assert\File(
* maxSize="6000000",
* mimeTypes={"image/png", "image/jpeg", "image/gif"}
* )
*
*/
public $logo;
上传功能和其他上传功能:
public function getAbsolutePath()
{
return null === $this->logo ? null : $this->getUploadRootDir().'/'.$this->id.'.png';
}
protected function getUploadRootDir()
{
return __DIR__.'/../../../../web/'.$this->getUploadDir();
}
protected function getUploadDir()
{
return 'uploads/events';
}
/**
* @ORM\PostPersist()
* @ORM\PostUpdate()
*/
public function upload()
{
if (null === $this->logo) {
return;
}
$path = $this->id . '.png';
if(file_exists ($this->getUploadRootDir() . $path))
unlink($this->getUploadRootDir() . $path);
$this->logo->move($this->getUploadRootDir(), $path);
$this->logo = null;
}
/**
* @ORM\PreRemove()
*/
public function storeFilenameForRemove()
{
$this->filenameForRemove = $this->getAbsolutePath();
}
/**
* @ORM\PostRemove()
*/
public function removeUpload()
{
if ($this->filenameForRemove) {
unlink($this->filenameFor Remove);
}
}
你知道为什么以及如何解决它吗?
谢谢!
答案 0 :(得分:1)
未检测到文件上传是Doctrine问题。由于文件上传不直接更改存储文件名的字段,因此Doctrine将实体视为未更改,因此将被忽略。仅在更改文件上载时会发生这种情况。
您可以在控制器中标记实体更改,例如:
if ($editForm['fileUpload']->getData() !== null) {
$entity->setLogo("logo_".uniqid(mt_rand(), true));
}
或者为实体修改时间创建一个字段,并强制它在控制器更新操作上更改:
// force unit of work to detect entity 'changes'
$entity->setModificationTime(new \DateTime());
答案 1 :(得分:0)
尝试在保存新图像之前先删除旧图像,这可能是一些权限错误,因为它已经存在,我总是这样做:
if (isset($this->logo) && $this->logo!= null) {
$old_img = $this->getUploadRootDir().'/'.$this->logo;
if (file_exists($old_img))
unlink($old_img);
}
否则,您应检查表单是否有效以及上载功能是否按预期运行并进行一些调试。