上传文件功能未命中 symfony2

Upload file function not hit symfony2

我遇到了一个奇怪的问题:当我想更改用户的个人资料图片时(使用 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);
    }
}

你知道为什么吗?我该如何解决?

谢谢!

尝试先删除旧图像,然后再保存新图像,这可能是一些权限错误,因为它对我来说已经存在了,我总是这样做:

        if (isset($this->logo) && $this->logo!= null) {
            $old_img = $this->getUploadRootDir().'/'.$this->logo;
            if (file_exists($old_img))
                unlink($old_img);
        }

否则您应该检查表单是否有效以及上传功能是否按预期运行并进行一些调试。

未检测到文件上传是 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());