我正在尝试通过我创建的API端点控制器上载文件:
/**
* @Route("/upload", methods="POST")
*/
public function upload(Request $request)
{
$form = $this->createForm(UserFileType::class);
$form->handleRequest($request);
if (!$form->isSubmitted()) {
dd($request->files->get('file'));
}
...
dd($request->files->get('file'))
按预期显示我的文件,所以我不清楚为什么当方法接收multipart/form-data
POST
请求和数据时,isSubmitted()
返回false。我通过Postman
提交POST
请求。为什么表单没有提交?
用户文件类型:
class UserFileType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('file', FileType::class, [
'mapped' => false,
'required' => true,
'constraints' => [
new File([
'maxSize' => '2M',
'mimeTypes' => [
'application/pdf',
'application/x-pdf',
],
'maxSizeMessage' => 'The file size must not exceed {{ limit }} {{ suffix }}.',
'mimeTypesMessage' => 'The file type {{ type }} is not valid',
])
],
]);
}
2条答案
按热度按时间jk9hmnmh1#
对于从
AbstractType
派生的窗体类,当窗体通过FormFactory
生成时,它使用fqcnToBlockPrefix
命名。您可以通过转储
$form->getName()
来确认这一点。现在,所实现的
$form->handleRequest
方法在提交表单之前通过请求处理程序执行许多检查。1.检查方法是否与表单的方法匹配
1.如果表单具有名称,则检查请求中是否存在表单名称
1.如果表单没有名称,检查是否至少填写了一个表单域
您的表单未通过请求处理程序
handleRequest
方法提交,因为请求中的字段未与表单名称正确Map在一起。您必须以下列方式MapHTTP POST请求中的表单名称:
这在Postman中可能并不简单,因此我建议将表单实现为一个无名称的表单,而不是重写
getBlockPrefix
以返回一个空字符串。ogq8wdun2#
由于这是关键字
handlerequest issubmitted false
出现的第一个SO线程,我想我会分享我的团队在相邻问题上的工作。我们在执行
PATCH
请求时得到了false
响应。我们最终意识到在创建表单时忽略了在method
选项中传递Request::METHOD_PATCH
。放入一个设置该值的三元语句就足以解决我们的问题。我希望这能帮助到一些人。