Symfony上传文件并保存带有id的文件名,工作时,保存到数据库时无法正常工作

时间:2012-02-08 14:40:19

标签: php symfony

/**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        if (null !== $this->file) {
            $this->path = $this->file->guessExtension();
        }
    }

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    public function upload()
    {
        if (null === $this->file) {
            return;
        }

        // you must throw an exception here if the file cannot be moved
        // so that the entity is not persisted to the database
        // which the UploadedFile move() method does
        $this->file->move($this->getUploadRootDir(), $this->id.'.'.$this->file->guessExtension());

        unset($this->file);
    }

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

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

嗨,在这个cose我上传文件  当我将文件名id保存到目录中时,所有工作,但进入数据库只保存jpg ...没有id

3 个答案:

答案 0 :(得分:2)

在预持续生命周期回拨中,您的实体在调用时尚未分配ID $this->id.'.'.$this->file->guessExtension()$this->id将为null

您已正确遵循食谱中的示例。它没有提到存储在路径下的数据库中的唯一东西将是扩展。这无关紧要,因为文件名始终是与扩展名连接的id。即$filename = $this->id . $this->path

如果您希望存储在路径下的字符串准确表示文件名,则必须考虑不同的命名策略。

答案 1 :(得分:0)

在preUpload方法中,只是将扩展文件影响到path属性。所以,在你的数据库中你只有jpg扩展名是正常的。

编辑:在preUpload方法中,ID尚未受到ORM的影响,因此您无法使用它来生成文件名。 IMO,你应该使用uniquid来生成一个唯一的文件名。像$this->path = uniquid().'.'.$this->file->guessExtension()

这样的东西

答案 2 :(得分:0)

好吧我曾经遇到过同样的问题(仅限.txt)。

如果你的文件名中有特殊字符,我认为这可能是一个问题。

我用这种方式解决了这个问题:

            $filepath = $this->file->getClientOriginalName();
        $filepath = str_replace(array('/',  ' ', '-', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'), array('_', '_', '', 'ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss'), $filepath);
        $this->path = $filepath;

希望这是你的问题的答案,如果它还没有解决:D