文件(图像)不会更新

时间:2018-04-02 12:35:22

标签: php symfony

我使用Symfony创建了一个应用程序,我正在使用Media Entity来上传文件并将它们与其他实体链接(例如:带有文章的图像)。

如果我想创建一个带有图片的新文章,一切都会完美无缺,但如果以后我想改变这个相同的图片则不行。此外,如果我同时更新另一个字段,例如标题或其他任何字段,我会看到它们都会改变,除了图片。

没有返回任何错误,所以我想这必须与配置相关联,但我找不到任何问题。

我的代码: 忽略原始

grep -rl 'max_value' | xargs sed -i "s/max_value='.*'/max_value='25'/g"

更新实体的控制器(例如文章)

<?php
namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;

/**
* Media
*
* @ORM\Table("media")
* @ORM\Entity(repositoryClass="AppBundle\Repository\MediaRepository")
* @ORM\HasLifecycleCallbacks
*/
class Media
{
/**
 * @var integer
 *
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var \DateTime
 *
 * @ORM\COlumn(name="updated_at",type="datetime", nullable=true)
 */
private $updateAt;

/**
 * @ORM\PostLoad()
 */
public function postLoad()
{
    $this->updateAt = new \DateTime();
}

/**
 * @ORM\Column(type="string",length=255, nullable=true)
 */
public $path;

public $file;

public function getUploadRootDir()
{
    return realpath(__dir__.'/../../../web/img/upload');
}

public function getAbsolutePath()
{
    return null === $this->path ? null : $this->getUploadRootDir().'/'.$this->path;
}

public function getAssetPath()
{
    return 'img/upload/'.$this->path;
}

/**
 * @ORM\PrePersist()
 * @ORM\PreUpdate()
 */
public function preUpload()
{
    $this->tempFile = $this->getAbsolutePath();
    $this->oldFile = $this->getPath();
    $this->updateAt = new \DateTime();

    if (null !== $this->file) {
        $this->path = sha1(uniqid(mt_rand(), true)).'.'.$this->file->guessExtension();
    }
}

/**
 * @ORM\PostPersist()
 * @ORM\PostUpdate()
 */
public function upload()
{
    $extentions_allowed = array('jpeg', 'png', 'svg', 'gif');

    if (null !== $this->file) {
        if(in_array($this->file->guessExtension(), $extentions_allowed))
        {
            $this->file->move($this->getUploadRootDir(), $this->path);
            unset($this->file);
            if ($this->oldFile != null) unlink($this->tempFile);

        }else {
            unset($this->file);
            throw new \Exception('Seules les images sont autorisées (jpg/png/gif/svg)');
        }
    }
}

/**
 * @ORM\PreRemove()
 */
public function preRemoveUpload()
{
    $this->tempFile = $this->getAbsolutePath();
}

/**
 * @ORM\PostRemove()
 */
public function removeUpload()
{
    if(file_exists($this->tempFile)){
        unlink($this->tempFile);
    }
}

/**
 * Get id
 *
 * @return integer
 */
public function getId()
{
    return $this->id;
}

public function getPath()
{
    return $this->path;
}

}

实体的形式

public function blocAction(Request $request, Bloc $bloc = null){

    if($bloc){
        $form = $this->createForm('AppBundle\Form\BlocType', $bloc, array(
            'type' => $bloc->getType()
        ));
        $form->handleRequest($request);

        if($form->isSubmitted() && $form->isValid() ){
                try{
                    $this->getDoctrine()->getManager()->persist($bloc);
                    $this->getDoctrine()->getManager()->flush();
                }catch (\Exception $e){
                    $this->addFlash(
                        'error',
                        $e->getMessage()
                    );
                }

            return $this->redirectToRoute('app_admin_bloc', array('id' => $bloc->getId()));
        }

        return $this->render('admin/bloc.html.twig', array(
            'bloc' => $bloc,
            'form' => $form->createView()
        ));
    }else{
       return $this->redirectToRoute('app_admin_index');
    }


}

1 个答案:

答案 0 :(得分:0)

首先,你应该清理你的媒体实体,因为它混合了公共属性和私有属性,并且它有太多的逻辑。最佳做法是:

  • 将所有属性设置为私有,并通过getter / setter方法访问它们;
  • 理想情况下将您的上传逻辑放在仅提供此功能的服务中。

然后,为了使表单触发错误,您需要向实体添加断言注释: 例如:

use Symfony\Component\Validator\Constraints as Assert;

class Media
{
    //...

    /**
     * @ORM\Column(type="string",length=255, nullable=true)
     */
    private $path;

     /**
     * @Assert\NotBlank()
     * @Assert\File(
     *     mimeTypes={"image/jpeg", "image/png", "application/svg+xml", "image/gif"},
     *     message="Seules les images sont autorisées (jpg/png/gif/svg)"
     * )
     */
    private $file;

    //...

这样你就可以摆脱当前的$extentions_allowed支票。

请查看有关如何正确上传文件的详细文档:https://symfony.com/doc/current/controller/upload_file.html