我面临一个奇怪的问题:当我想改变一个用户的配置文件的图片(使用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);
}
}
你知道为什么吗?我该如何解决这个问题?
谢谢!
文件上传未检测到是原则问题。由于文件上传不直接更改存储文件名的字段,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());
在保存新图像之前尝试先删除旧图像,这可能是一些权限错误,因为它已经存在于我,我总是这样做:
if (isset($this->logo) && $this->logo!= null) {
$old_img = $this->getUploadRootDir().'/'.$this->logo;
if (file_exists($old_img))
unlink($old_img);
}
否则,您应该检查表单是否有效,上传函数是否按预期运行,并进行一些调试。