Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

symfony 4 Upload

How to upload a file in symfony 4.I have done with the symfony document. I don't know where I have missed something. Its throws error while uploading file give me some clues

REFERED LINK:

https://symfony.com/doc/current/controller/upload_file.html

ERROR:

The file "" does not exist

Entity

    public function getBrochure()
    {
        return $this->brochure;
    }

    public function setBrochure($brochure)
    {
        $this->brochure = $brochure;

        return $this;
    }

File upload Listener

class FileUploader
{
    private $targetDirectory;

    public function __construct($targetDirectory)
    {
        $this->targetDirectory = $targetDirectory;
    }

    public function upload(UploadedFile $file)
    {
        $fileName = md5(uniqid()).'.'.$file->guessExtension();

        $file->move($this->getTargetDirectory(), $fileName);

        return $fileName;
    }

    public function getTargetDirectory()
    {
        return $this->targetDirectory;
    }
} 
like image 653
viveka Avatar asked Feb 03 '26 06:02

viveka


1 Answers

This Symfony tutorial works fine for me so I'll try to explain how and perhaps it will help you or people still looking for an answer, this post getting a bit old.

So first you have to create the FileUploader service in App\Service for better reusability (chapter: Creating an Uploader Service). You can basically copy/paste what they've done here, it works like a charm. Then you need to open your services.yaml in Config folder and explicit your brochure directory:

parameters:
    brochures_directory: '%kernel.project_dir%/public/uploads/brochures'
# ...
services:
    # ...

    App\Service\FileUploader:
        arguments:
            $targetDirectory: '%brochures_directory%'

Now everything is normally ready to use your FileUploader service. So if you're in your controller (for example), I guess you want to use it in a form. Thus, you just have to do this (don't forget to use your Service in your Controller):

public function myController(FileUploader $fileUploader)
{
    // Create your form and handle it

    if ($form isValid() && &form isSubmitted()) {
        $file = $myEntity->getBrochure();
        $fileName = $this->fileUploader->upload($file);
        $myEntity->setBrochure($fileName);

        // Form validation and redirection
    }
    // Render your template
}

One important point I forgot to say. In your FormType, you need to say that the Brochure will be a FileType:

$builder->add('brochure', FileType::class)

But in your entity you have to specify your brochure is stored as a "string":

/**
 * @MongoDB\Field(type="string")
 */
 protected $brochure;

The reason is your file is getting uploaded and saved in your public/uploads/brochure. But your database is only remembering a string path to reach it.

I hope this will help!

like image 163
Domopus Avatar answered Feb 13 '26 02:02

Domopus