Skip to content

Subida de archivos

Documentación oficial aquí

Para poder subir archivos desde un formulario, debemos seguir los siguientes pasos:

1 En el formulario debemos agregar el siguiente campo

<?php
use Symfony\Component\Form\Extension\Core\Type\FileType;

class PostType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            //Subida de archivoas
            ->add('file', FileType::class, [
                'label' => 'photo',
                'required' => false,
            ])
            ->add('submit', SubmitType::class)
        ;
    }
    ...
}

2 Luego desde el controlador debemos capturarlo, cambiar el nombre del archivo por seguridad y guardarlo en la ruta especificada en services.yml

<?php
use Symfony\Component\HttpFoundation\File\Exception\FileException;
use Symfony\Component\String\Slugger\SluggerInterface;
...

class PostController extends AbstractController
{
    ...

    #[Route('/', name: 'app_post')]
    public function index(Request $request, SluggerInterface $slugger): Response
    {
        $post = new Post();

        $posts = $this->em->getRepository(Post::class)->findAllPosts();

        $form = $this->createForm(PostType::class, $post);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $file = $form->get('file')->getData();
            $url = str_replace(" ", "-", $form->get('title')->getData());

            if ( $file ){
                //Cambiamos el nombre del archivo 
                $originalFilename = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
                $safeFilename = $slugger->slug($originalFilename);
                $newFilename = $safeFilename.'-'.uniqid().'.'.$file->guessExtension();

                //Guardamos el archivo en el servidor
                try{
                    $file->move(
                        $this->getParameter('files_directory'),
                        $newFilename
                    );
                } catch (FileException $e){
                    throw new Exception('Ups there is a problem with your file');
                }

                //Guardamos el nuevo nombre del archivo en BD
                $post->setFile($newFilename);
            }
            ... 
        }

        ...
    }

}

3 Finalmente debemos configurar en services.yaml la ruta donde se guardaran los archivos

parameters:
    files_directory: '%kernel.project_dir%/public/uploads/files'