0

我尝试在 Symfony v5.3 中准备非常简单的上传控制器。我遵循了官方教程,但可能我遗漏了一些东西,我找不到它是什么。

我的类型类:

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.",
                    ])
                ],
            ]);
    }
}

我的控制器:

<?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);
    }
}

当我运行 curl 时:

curl -i -X POST -H "Content-Type: multipart/form-data" -F "upload_file=@a.csv" https://localhost:8000/api/v1/import/x

我收到not submitted响应错误。

我发现改变:

$form->handleRequest($request);

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

可以提供帮助,但在此更改之后,我收到另一个错误:filedata is null

请帮我找出我错过了什么......

4

3 回答 3

1

最后

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

做了我想要的。但是我仍然无法理解,而 symfony 表单没有正确处理它...... :(

于 2021-06-19T13:24:53.540 回答
0

尝试这个:

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

就像在这个例子中

于 2021-06-20T16:17:38.103 回答
0

基于官方文档

你需要用来$request->get('upload_file')->getData()获取 UploadedFile 对象

于 2021-06-20T12:06:24.633 回答