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

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);  
        }
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.
Coté web services (toujours sous symfony):

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);
        }
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.

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:

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
Des avis sur où j'ai pu me tromper?

Merci d'avance !