Symfony4 使用VichUploaderBundle通过API上载文件

Symfony4 使用VichUploaderBundle通过API上载文件,symfony4,vichuploaderbundle,Symfony4,Vichuploaderbundle,所以,我需要的是一个基本的文件上传。我拥有的是Symfony 4和VichUploaderBundle,完全按照描述集成 实体标记为@Vich\Uploadable,字段定义正确: /** * @Vich\UploadableField(mapping="images", fileNameProperty="fileName") * @var File */ private $file; /** * @ORM\Column(type="string", length=255) */

所以,我需要的是一个基本的文件上传。我拥有的是Symfony 4和VichUploaderBundle,完全按照描述集成

实体标记为@Vich\Uploadable,字段定义正确:

/**
 * @Vich\UploadableField(mapping="images", fileNameProperty="fileName")
 * @var File
 */
private $file;

/**
 * @ORM\Column(type="string", length=255)
 */
private $fileName;
这是我喜欢的类型:

class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', TextType::class)
            ->add('file', VichImageType::class, ['allow_file_upload' => true])
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => My::class,
            'allow_extra_fields' => false,
            'http_method' => 'POST'
        ]);

        $resolver->setRequired('http_method');
    }
}
控制器中的内容:

$form = $this->createForm(MyType::class, null);
    $form->submit(array_merge($request->request->all(), $request->files->all()));

    if ($form->isSubmitted() && $form->isValid()) {
        /** @var $my */
        $my = $form->getData();
        $em = $this->getDoctrine()->getManager();
        $em->persist($my);
        $em->flush();

        return $this->json($my);
    }
其结果是转型例外:

复合表单在提交时需要数组或NULL

我已经用xDebug调试了整个过程——它第一次成功地提交了
name
字段,甚至
file
字段。但是,出于某种原因,它认为这是一个复合形式,并试图再次提交它-这显然导致了转换异常

而且,当我试图将
'composite'=>设置为false时,它根本不会提交文件字段


这里可能有什么问题?我在文档中看到,在EasyAdmin中使用它,只需指定字段名并键入“vich_image”就足够了,为什么它在EasyAdmin之外不起作用?顺便说一句,您可能会注意到,我添加了额外的参数
'allow_file_upload'=>true
,因为没有它它它是不会提交的

,因此,进一步的研究让我找到了这个答案

解决方法是提交如下表格:

$form->submit(array_merge(
    $request->request->all(),
    ['file' => $request->files->all()]
));

所以,进一步的研究让我找到了这个答案

解决方法是提交如下表格:

$form->submit(array_merge(
    $request->request->all(),
    ['file' => $request->files->all()]
));