2

I try to prepare very simple upload controller in Symfony v5.3. I followed official tutorial, but probably I am missing something, and I can't find what it is.

My Type class:

namespace App\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\FileType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints\File;

class ImportXType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('upload_file', FileType::class, [
                'required' => true,
                'constraints' => [
                    new File([
                        'mimeTypes' => [
                            'text/csv',
                        ],
                        'mimeTypesMessage' => "This document isn't valid.",
                    ])
                ],
            ]);
    }
}

My Controller:

<?php

namespace App\Controller;

use App\Form\ImportXType;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;

/**
 * Class ImportController
 * @package App\Controller
 * @Route("/api/v1/import", name="import_api")
 */
class ImportController extends AbstractController
{
    private $logger;

    /**
     * ImportController constructor.
     */
    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @Route("/x", name="import_x", methods={"POST"})
     */
    public function importX(Request $request): Response
    {
        $form = $this->createForm(ImportXType::class, null, array('csrf_protection' => false));
        $form->handleRequest($request);

        if ($form->isSubmitted()) {
            if ($form->isValid()) {
                $fileData = $form->getData()['upload_file'];
                if ($fileData) {
                    $this->logger->info(file_get_contents($fileData->getPathname()));
                } else {
                    return new Response("filedata is null", 400);
                }
            } else {
                return new Response("not valid", 400);
            }
        } else {
            return new Response("not submitted", 400);
        }
        return new Response("OK", 200);
    }
}

When I run curl:

curl -i -X POST -H "Content-Type: multipart/form-data" -F "[email protected]" https://localhost:8000/api/v1/import/x

I get not submitted response error.

I found out that changing:

$form->handleRequest($request);

to

$form->submit(array_merge([], $request->request->all()));

can help, but after this change I get another error: filedata is null

Please help me to find out what I am missing...

3 Answers 3

1

Finally

$request->files->get("upload_file")

did what I wanted. But I still cannot understand while symfony form is not handling it properly... :(

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

Comments

1

try this:

if ($form->isValid()) {
   $fileData = $form['upload_file']->getData();
   ...

like in this example

Comments

0

Based on official doc

you need to use $request->get('upload_file')->getData() to get UploadedFile object

Comments

Your Answer

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

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.