Symfony2无法访问以POST格式发送的多个文件

时间:2017-11-21 15:11:01

标签: forms symfony post header

我有一个非常奇怪的问题。我在Symfony2中从一个唯一的表单发送多个文件。它们似乎正常工作,而我检查Network->headers并且它们在那里:

------WebKitFormBoundaryqycNCCLBhUXBkZAv
Content-Disposition: form-data; name="form[files]"; 
filename="image1.jpg"
Content-Type: image/jpeg

------WebKitFormBoundaryqycNCCLBhUXBkZAv
Content-Disposition: form-data; name="form[files]"; 
filename="image2.png"
Content-Type: image/png

但是,当我尝试从控制器获取这些文件时,我无法获得这些文件:

$form->handleRequest($request)->getData() 

只显示一个文件(第1个),$request->files的工作方式相同,仅显示第1个文件。

不应该这么复杂:/

这是我在控制器中的表单代码:

$form = $this->createFormBuilder($data)
    ->add('name')
    //->add('file')
    ->add('files', FileType::class, array(
        'attr' => array(
            'data_class' => null,
            'accept' => 'image/*',
            'multiple' => true
         )
    ))
    ->getForm();

你知道我在这里做错了吗?

2 个答案:

答案 0 :(得分:0)

您需要将symfony multiple选项设置为true。

$form = $this->createFormBuilder($data)
             ->add('name')
            //->add('file')
             ->add('files', FileType::class, array(
                'multiple'=>true
                'attr' => array(
                    'data_class' => null,
                    'accept' => 'image/*',
                    'multiple' => 'multiple'
                )
            ))
            ->getForm();

答案 1 :(得分:0)

非常感谢你的回答。最后我得到了解决方案。

首先,正如Aleem所说,我们必须在createFormBuilder时声明多个上传文件:

    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    <intent-filter>
        <data android:scheme="glassify" android:host="open" />
        <action android:name="android.intent.action.VIEW" />
        <!-- <category android:name="android.intent.category.DEFAULT" /> -->
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="@string/fb_login_protocol_scheme" />
    </intent-filter>

问题在于Symfony教程还没有为多个文件上传做好准备,所以,这很棘手,但有一种方法可以做到。而不是

$form = $this->createFormBuilder()
            ->add('file', FileType::class, array(
                'multiple' => true,
                'attr' => array(
                    'data_class' => null,
                    'accept' => 'image/*',
                    'multiple' => 'multiple'
                )
            ))
            ->getForm();

你必须:

$form->handleRequest($request);
if ($form->isValid() && $form->isSubmitted()) {

然后在$ data中你可以找到多个可以预告的UploadFile对象:

if ($request->isMethod('POST')) {
$data = $form->handleRequest($request)->getData();

你可以自己设置SetFile并上传,这个操作通常由$ form-&gt; handleRequest完成。

在您的Entity类中,您不能使用Lifecycle Callbacks。

TY