0

Could you help me resolve this issue? I tried this tutorial: Symfony Upload

It works fine(stored to the database path to img), but don't store or move image to the folder.

Entity:

    <?php
namespace DbBundle\Entity;

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


/**
 * @ORM\Entity
 * @ORM\HasLifecycleCallbacks
 */
class File
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @ORM\Column(type="string", length=255)
     * @Assert\NotBlank
     */
    public $name;

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

    /**
     * @Assert\File(maxSize="6000000")
     */
    private $file;

    private $temp;

    /**
     * Sets file.
     *
     * @param UploadedFile $file
     */
    public function setFile(UploadedFile $file = null)
    {
        $this->file = $file;
        // check if we have an old image path
        if (isset($this->path)) {
            // store the old name to delete after the update
            $this->temp = $this->path;
            $this->path = null;
        } else {
            $this->path = 'initial';
        }
    }

    /**
     * @ORM\PrePersist()
     * @ORM\PreUpdate()
     */
    public function preUpload()
    {
        if (null !== $this->getFile()) {
            // do whatever you want to generate a unique name
            $filename = sha1(uniqid(mt_rand(), true));
            $this->path = $filename.'.'.$this->getFile()->guessExtension();
        }
    }

    /**
     * Get file.
     *
     * @return UploadedFile
     */
    public function getFile()
    {
        return $this->file;
    }

    /**
     * @ORM\PostPersist()
     * @ORM\PostUpdate()
     */
    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->path);

        // check if we have an old image
        if (isset($this->temp)) {
            // delete the old image
            unlink($this->getUploadRootDir().'/'.$this->temp);
            // clear the temp image path
            $this->temp = null;
        }
        $this->file = null;
    }

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

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

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

    protected function getUploadRootDir()
    {
        // the absolute directory path where uploaded
        // documents should be saved
        return __DIR__.'/../../../../web/'.$this->getUploadDir();
    }

    protected function getUploadDir()
    {
        // get rid of the __DIR__ so it doesn't screw up
        // when displaying uploaded doc/image in the view.
        return 'uploads/documents';
    }
}

Controller:

    public function uploadAction(Request $request)
    {
        $em = $this->getDoctrine()->getManager();
        $document = new File();
        $form = $this->createFormBuilder($document)
            ->add('name')
            ->add('file')
            ->getForm();

        $form->handleRequest($request);
        if ($form->isValid()) {
            $em->persist($document);
            $em->flush();

            return $this->redirectToRoute('web_portal_file');
        }


        return $this->render('WebPortalBundle:Default:file.html.twig',array('file_form' => $form->createView()));
    }

EDIT: Twig:

 <form action="{{ path('web_portal_file') }}" method="post" {{ form_enctype(file_form) }}>
    {{ form_widget(file_form.file) }}
    {{ form_rest(file_form) }}
    <input type="submit"/>
</form>

I don't know what to do to make this work. Every time path is saved to the database, but folder is empty ...

5
  • Is there correct folder permissions for webserver user? Commented Aug 5, 2015 at 14:41
  • yes, /web/uploads/documents chmod 0777 for user. Commented Aug 5, 2015 at 14:45
  • Have you checked if the method getUploadRootDir() returns the correct path? Commented Aug 5, 2015 at 14:51
  • getUploadRootDir() returns this: /var/www/vhosts/vps***.ovh.net/httpdocs/src/DbBundle/Entity/../../../../web/uploads/documents looks like correct Commented Aug 5, 2015 at 15:09
  • Try to cd inside that path from the console: I think you need one /.. less. Commented Aug 5, 2015 at 15:21

3 Answers 3

2

Remember to upload files will be put in the form tag data encryption: PHP method uploads

In Symfony2, with Twig would be:

    form class="" action="" method="post" {{ form_enctype(file_form) }}
       {{ form_widget(file_form) }}
    /form

Sign up to request clarification or add additional context in comments.

Comments

0

The problem may be here. On Controller. When you are persisting the entity you call the upload() method

    if($form->isValid()) {

       $em->persist($document);       
       $em->flush();

       return $this->redirectToRoute('web_portal_file');
    }

In CookBook says:

The previous controller will automatically persist the Document entity with the submitted name, but it will do nothing about the file and the path property will be blank.

An easy way to handle the file upload is to move it just before the entity is persisted and then set the path property accordingly. Start by calling a new upload() method on the Document class, which you'll create in a moment to handle the file upload:

Now

    if($form->isValid()) {

         $document->upload();
         $em->persist($document);
         $em->flush();

         return $this->redirectToRoute('web_portal_file');
    }

Comments

-1

The following code works:

protected function getUploadRootDir() {
    // the absolute directory path where uploaded
    // documents should be saved
    return __DIR__ . '/../../../web/' . $this->getUploadDir();
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.