Problème Upload fichier via Web Services - Symfony
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:
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:
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:
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 !