2017-03-21 1 views
1

j'ai que la forme (extension AbstractType):Symfony3-ajax télécharger plusieurs fichiers en utilisant fetch et FormData

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

Cette forme minuscule dans le frontend (de ReactJS):

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

Je le téléchargement est déclenché ce qui se passe ce qui suit:

const data = new FormData(form); 

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

Mais sur le serveur aucun fichier n'arrive, donc dans le contrôleur :

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

et ainsi la forme n'est jamais valide, aussi.

Dans un test fonctionnel J'utilise ceci:

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

$file fait référence à un objet de type UploadedFile. Cela fonctionne, alors quelle est l'erreur ici?

Répondre

1

Comme je l'ai pu trouver dans this answer:

L'idée de base est que chaque partie (diviser par chaîne en limite avec -) a ses propres en-têtes (Content-Type dans la deuxième partie, par exemple. L'objet FormData gère tout cela pour vous, c'est donc une meilleure façon d'atteindre nos objectifs.

Donc, pour faire le travail de téléchargement, je devais laisser tomber le content-type des en-têtes et renommer le champ de saisie: file[files][].