Symfony3-ajax使用fetch和FormData上传多个文件

时间:2017-03-21 10:18:42

标签: ajax forms file-upload fetch symfony-3.2

我有那个表格(扩展AbstractType):

public function buildForm(FormBuilderInterface $builder, array $options)
{
  $builder
    ->add('files', FileFieldType::class, [
      'label' => 'Files',
      'multiple' => true]
    );
}

前端的这个小形式(ReactJS):

 <form onChange={onChange} ref={node => form = node}>
   <input type="file" multiple={multiple} name="file[files]" />
 </form>

我上传被触发,发生以下情况:

const data = new FormData(form); 

fetch('/upload', {
  method: 'POST',
  headers: {
    'Content-Type': 'multipart/form-data'
  },
  body: data
});

但是在服务器上没有文件到达,所以在控制器中:

$request->files->all(); //[]

因此表格永远无效。

在功能测试中我使用它:

$client->request('POST', '/upload', [], ['file' => ['files' => $file]]);

其中$file指的是UploadedFile类型的对象。这有效,那么这里的错误是什么?

1 个答案:

答案 0 :(得分:1)

正如我在this answer中找到的那样:

  

基本思想是每个部分(在与 - 的边界中用字符串分割)具有它自己的标题(例如,第二部分中的Content-Type。)FormData对象为您管理所有这些,所以这是实现目标的更好方式。

因此,要使上传工作,我需要从标题中删除content-type并将输入字段重命名为:file[files][]