Symfony загрузить файл и сохранить имя файла с идентификатором, работать, при сохранении в базу данных не работает - PullRequest
0 голосов
/ 08 февраля 2012
/**
     * @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;
    }

привет, я загружаю файл когда я сохраняю идентификатор файла в каталоге, все работает, но в базу данных сохраняется только jpg ... без идентификатора

Ответы [ 3 ]

2 голосов
/ 09 февраля 2012

При обратном вызове в течение жизненного цикла вашей сущности еще не был присвоен идентификатор, поэтому $this->id.'.'.$this->file->guessExtension() при вызове $this->id будет null

Вы правильно следовали примеру в кулинарной книге. Просто не упоминается, что единственное, что хранится в базе данных в пути, это расширение. Это не имеет значения, поскольку имя файла всегда будет идентификатором, связанным с расширением. т.е. $filename = $this->id . $this->path

Поэтому вам придется подумать о другой стратегии именования, если вы хотите, чтобы строка, хранящаяся под путем, точно представляла имя файла.

0 голосов
/ 30 мая 2012

Хорошо, у меня одна и та же проблема была однажды (только с .txt).

Я думаю, что это может быть проблемой, если у вас есть специальные символы в вашем имени файла.

Я решил это таким образом:

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

надеюсь, что это ответ на вашу проблему, если она еще не решена: D

0 голосов
/ 09 февраля 2012

В вашем методе preUpload вы просто влияете на файл расширения для свойства path. Таким образом, это нормально в вашей базе данных, у вас просто расширение jpg.

РЕДАКТИРОВАТЬ: В вашем методе preUpload ID еще не влияет на ORM, поэтому вы не можете использовать его для генерации имени файла. IMO, вы должны использовать uniquid для генерации уникального имени файла. Что-то вроде $this->path = uniquid().'.'.$this->file->guessExtension()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...