Bonjour à tous,
J'ai un problème concernant un upload de fichier. Je souhaite qu'un utilisateur puisse uploader un fichier qui sera alors envoyé à un web service, tout cela sous symfony.
Mon controller qui gere l'upload
Ici, j'essaye donc d'envoyer via l'url du webservice et la variable $data, tout ce dont j'ai besoin : nom, le chemin et bien sur le fichier.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 /******* ON RECUPERE LE CHEMIN POUR L'UPLOAD *******/ $chemin = $this->get('portal_front.api_call')->getDeDocUpload(); echo $dossier = "upload/".$chemin['dossier'].$chemin['lot']; /******* CREATION DU FORMULAIRE UPLOAD *******/ $document = new UploadFiles(); $form = $this->createFormBuilder($document) ->add('name', 'text',array('label' => ' ', 'required' => true)) ->add('file', 'file', array('label' => ' ', 'required' => true)) ->add('submit', 'submit', array('label' => 'Valider')) ->getForm(); $form->handleRequest($request); /******* SI LE FORMULAIRE EST VALIDE *******/ if ($form->isValid()) { /******* UPLOAD DU FICHIER ET ECRITURE EN BDD *******/ $em = $this->getDoctrine()->getManager(); //var_dump($document); //$document->upload($dossier); $em->persist($document); $em->flush(); /******* ON ENVOI LES DONNEES AU WEBSERVICE *******/ $data = array(); $data["fichier"] = $document->getFile(); $data["titre"] = $form->getData()->getName(); $data["chemin"] = $dossier."/de".$user_id."_id"; $data["file"] = $form->getData()->getPath(); //var_dump($data); $this->get('session')->getFlashBag()->add('success', 'Le fichier '.$data["titre"].' a bien été ajouté.'); /******* URL DU WEBSERVICE EN POST *******/ $response = $this->client->post('/de/data-upload/'.$user_id, $data); }
Coté web services (toujours sous symfony):
Lorsque je le fais sous Postman, qui permet de simuler l'upload de fichier. Le fichier est bien copié dans le nouveau répertoire, aucun problème.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 try { /* ON RECUPERE LE FICHIER, NOM ET EXTENSION */ $file = $request->files->get("fichier"); $ext = $file->guessExtension(); $name = $file->getClientOriginalName(); $results = $request->request->all(); /* ON INSERE LES DONNEES */ $sql = 'INSERT INTO de_upload SET id_de= :id, nom_fichier= :nom, titre_fichier = :titre, chemin = :chemin, extension= :file, id_type_doc=3'; $query = $app['pdo']->prepare($sql); $exec = $query->execute(array('id' => $id, 'nom' => $name, 'titre' => $results['titre'], 'chemin' => $results['chemin'], 'file' => $ext)); /* ON RECUPERE l'ID DU FICHIER DANS LA BASE */ $sql = 'SELECT id FROM de_upload WHERE id_de= :id ORDER BY id DESC'; $query = $app['pdo']->prepare($sql); if (!$query->execute(array('id' => $id))) { return new Response($query->errorInfo()[2], Response::HTTP_FAILED_DEPENDENCY); } $content = $query->fetch(\PDO::FETCH_OBJ); $lastId = $content->id; /* ON AJOUTE L'ID AU CHEMIN ET ON UPDATE */ $sql = 'UPDATE de_upload SET chemin= :chemin WHERE id= :id' ; $query = $app['pdo']->prepare($sql); $exec = $query->execute(array('id' => $lastId, 'chemin' => $newChemin)); /* ON COPIE LE FICHIER DANS LE NOUVEAU REPERTOIRE */ $newChemin = $results['chemin'].$lastId; $file->move("$newChemin, $name); return new Response($lastId, Response::HTTP_CREATED); } catch (Exception $e) { // Erreur : code HTTP 500 return new Response($e->getMessage(), Response::HTTP_INTERNAL_SERVER_ERROR); }
Mais lorsque je passe par mon appli, le webservice créé un fichier nommé "fichier" en .txt qui contient un adresse de type /tmp/phpBHDG.tmp. L'insertion en BDD se fait sans problème et le fichier se créé également dans le bon dossier. Mais je ne comprends pas pourquoi, il créé un simple fichier.txt avec une adresse à l’intérieur. Jai l'impression que l'envoi de "$data["fichier"] = $document->getFile();" ne se fait pas correctement ou alors je n'arrive pas à traiter l'info coté webservices. le var_dump du $data["fichier"] dans le cas d'un upload d'une image basique:
Des avis sur où j'ai pu me tromper?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 object(Symfony\Component\HttpFoundation\File\UploadedFile)[9] private 'test' => boolean false private 'originalName' => string 'Tree.jpg' (length=8) private 'mimeType' => string 'image/jpeg' (length=10) private 'size' => int 770042 private 'error' => int 0
Merci d'avance !
Partager