dizzyd
dizzyd

Reputation: 201

Symfony2 - Undefined property in entity for file upload

I am getting the following error when trying to upload a file, it's odd because I've used the same code on other projects without any problems/errors.

What am I missing here?

Notice: Undefined property: Acme\DemoBundle\Entity\Article::$file in /var/www/html/InsideFight/src/Acme/DempBundle/Entity/Article.php line 277

The problem line is:

if (null !== $this->file) {

I do not have any file upload code in my controller it's being handled in the entity.

Entity

public $file;


public function getUploadDir()
{
    return 'images/';
}

public function getUploadRootDir()
{
    return __DIR__ . '/../../../../web/' . $this->getUploadDir();
}

public function getWebPath()
{
    return null === $this->image ? null : $this->getUploadDir() . '/' . $this->image;
}

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

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

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

    // If there is an error when moving the file, an exception will
    // be automatically thrown by move(). This will properly prevent
    // the entity from being persisted to the database on error
    $this->file->move($this->getUploadRootDir(), $this->image);

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

Upvotes: 0

Views: 2851

Answers (2)

pazulx
pazulx

Reputation: 2379

Thats because you do unset($this->file);. Change it to $this->file = null.

Upvotes: 2

Praveesh
Praveesh

Reputation: 1327

Include the following namespace.

  use Symfony\Component\HttpFoundation\File\UploadedFile;

Make the file variable private and create a temp file variable.

  private $file;
  private $tempFile

Then create getter and setter methods for $file.

public function getFile()
{
    return $this->file;
}

public function setFile(UploadedFile $file = null)
{
    $this->file = $file;

    if (isset($this->image)) {
        // store the old name to delete after the update
        $this->tempfile = $this->image;
        $this->image = null;
    } else {
        $this->image = 'initial';
    }
}

Then, modify preUpload and upload functions.

public function upload()
{
     if (null === $this->getFile()) {
        return;
    }

    // if there is an error when moving the file, an exception will
    // be automatically thrown by move(). This will properly prevent
    // the entity from being persisted to the database on error
    $this->getFile()->move($this->getUploadRootDir(), $this->image);

    // check if we have an old image
    if (isset($this->tempFile)) {
        // delete the old image
        unlink($this->getUploadRootDir() . '/' . $this->tempFile);

        // clear the temp image path
        $this->tempFile = null;
    }
    $this->file = null;
}



public function preUpload()
{
   if (null !== $this->getFile()) {
        // generate a unique name
        $filename = uniqid();


        $this->image = $filename . '.' . $this->getFile()->guessExtension();


    }
}

Upvotes: 0

Related Questions