我尝试在 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
请帮我找出我错过了什么......