1

我正在使用这里解释的方法来实现多文件上传,但它找不到让它工作的方法。我知道已经有很多关于它的问题,但我找不到适合我的案例的答案。

请注意,我将文件的内容存储在数据库中,这要归功于具有名称、内容和类型属性的文件实体。然而,为了使它工作,我没有将表单映射到这个实体。

所以,我的控制器看起来像这样:

    $files = [];

    $form = $this->createForm(MultipleFilesType::class, []);

    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {

        $files = $form->getData();

        dump($files);

        foreach ($files as $file)
        {
            //code that stores the file in the database which works fine and is not relevant to my problems I think
        }
        return // redirect to some page
    }

    return //form to the view

我的 MultipleFilesType 是嵌入多个 addFileType 的集合:

class MultipleFilesType extends AbstractType
{
/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('files', CollectionType::class, array (
            'entry_type' => addFileType::class,
            'allow_add' => true,
            'allow_delete' => true,
            'label' => false,
            'mapped' => false,
            'data' => array(
               array ('file' => null)
            )
        ))
    ;
}
}

我的 addFileType 是这样的:

class AddFileType extends AbstractType
{


/**
 * @param FormBuilderInterface $builder
 * @param array $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('file', FileType::class, array (
            'label' => false
        ))
    ;

}
}

在我看来,由于链接文档中解释了一些 JQuery,我可以添加/删除字段。(代码与文档中的代码或多或少相同,只是我不使用实体,所以我没有在这里展示)。

我首先尝试进行单个文件上传,效果很好,然后我尝试了上面的代码,使用 collectionType 和 $files 数组将数据从表单检索到控制器,但我遇到了这些问题:

当我提交表单时,显然第一个之后的文件值无效。

当我只提交一个文件(没有验证错误)时,控制器中的转储($files)无论如何都会向我显示一个空数组。

任何帮助将不胜感激 =) 如果您认为需要更多代码,请不要犹豫。

谢谢 !

4

2 回答 2

2

代替

$files = $form->getData();

它是

$files = $form->get("files")->getData();
于 2016-07-06T08:49:16.653 回答
1

AddFileType是无用的,并且会破坏您的表单映射。直接FileType在你的MultipleFileType.

然后,对于您的其他错误,主要取决于您的 JavaScript 和您的实体。

在客户端,您需要提交名称为“multiple_file_form[files][INDEX]”的每个文件,其中 INDEX 是列表中每个文件的索引。要做到这一点:

  • 如果您同步提交(使用提交按钮和form标签),请<input type="file" name="multiple_files_form[files][INDEX]">输入标签
  • 如果您的表单是异步提交的(通过 AJAX),您的请求参数必须是这样的数组:

    {
         "multiple_files_form": {
             "files": [
                 // Your files here...
             ]
         }
     }
    
于 2016-07-04T16:19:54.017 回答