Upload photo sans formulaire (API)

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour,

Je fait une App mobile et j'ai besoin d'upload une photo via l’appareil photo de mon smartphone tout cela via mon API. Cependant au final symfony n arrive pas a traiter la photo. Quand il veut faire l'INSERT INTO le champs name (nom du fichier) de mon entité photo est null.

Voici mon controller :

 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
<?php
/**
 * @throws AccessDeniedException
 * @return array
 * @FOSRest\View()
 */
public function apiUploadAction()
{
    $photo = new Photo;
    $photo->setUser($this->getUser());
    $photo->setFile = new UploadedFile(
        $_FILES["file"]["tmp_name"], 
        $_FILES["file"]["name"],
        $_FILES["file"]["type"],
        $_FILES["file"]["size"],
        $_FILES["file"]["error"],
        $test = false
    );

    $em = $this->getDoctrine()->getManager();
    $em->persist($photo);
    $em->flush();

    $apiResponse = array(
        "code"      => true,
        "style"     => "success",
        /*********** Ce que vous voyez sur le screenshot ***********/
        "message"   => $_FILES["file"]["tmp_name"]."    ".$_FILES["file"]["name"]."    ".$_FILES["file"]["type"]."    ".$_FILES["file"]["size"]."    ".$_FILES["file"]["error"],
    );

    $view = View::create();
    $view->setFormat('json');
    $view->setData($apiResponse);
    return $this->get('fos_rest.view_handler')->handle($view);
}

Voici ce que reçoit l'app si je commente le flush();

Donc comme vous voyez symfony a bien tout ce qu'il faut. Et mon entité ci-dessous est déjà utilisé par la version web de mon app et tout marche très bien. De plus c'est quasi un copié/coller de l'entité du tutorial de winzou sur sf2.

1
EDITE    

Je ne comprends pas ou ça foire. Si quelqu'un a une idée…

Merci, bonne journée

Édité par hotgeart

+0 -0

Salut !

As tu vérifié que setName() est bien appelé et quel paramètre il reçoit ?

L'upload asynchrone, c'est pour des formulaires imbriqués, ou tu peux vraiment uploader des images comme si c'était l'entité principale du formulaire ?

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Auteur du sujet

Salut,

L'upload asynchrone, c'est pour des formulaires imbriqués, ou tu peux vraiment uploader des images comme si c'était l'entité principale du formulaire ?

Désolé je n'ai pas compris ce que tu voulais dire.

As tu vérifié que setName() est bien appelé et quel paramètre il reçoit ?

Non c'est assez dure de debug une app mobile en html5, surtout que je ne peux pas passer par un émulateur (camera). Donc j'essaye de me débrouiller avec des alerts, ce qui me rend fou :D .

Si le problème vient de l'entité la seule chose que je vois c'est qu'a la ligne 178, si le file est null alors on stop. Car s'il n'est pas null je devrais avoir un name, je n'ai aucune condition par la suite qui empêcherait d'avoir un name (ligne 230).

Donc pour moi c'est vraiment la "passation" du file qui doit poser problème. Ah un moment donné mon field file devient null. Dans le cas contraire symfony me renverrait une 500 bien avant le insert into, non ? Du style quand il essaye de rezise l'image. Il devrait me gueuler dessus, car il ne trouve pas le fichier ou quelque chose du genre.

+0 -0

Cette réponse a aidé l'auteur du sujet

C'est effectivement un peu plus symfoniesque, il n'est pas impossible que $_FILES soit nettoyé quand l'objet Request a été construit.

Note que la façon recommandée de faire désormais est de passer la requête en paramètre de l'action, et plus d'utiliser getRequest().

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte