Flex – PHP – FileReference.upload – Upload et perte de session
Je reviens vous proposer un article, ce n’était pas prévu, mais je me suis heurté à un problème aberrant une bonne partie de l’après-midi, me faisant perdre un temps fou.
Je me suis replongé dans le développement Flex récemment pour un projet fort intéressant, tout allait bien et les manipulations de codes revenaient rapidement, puis avec Flex Builder, quel bonheur… Ensuite vient le soucis qui rend fou.
J’ai utilisé une classe actionscript d’upload d’images en passant en httpservice (pour l’instant ça me va), je passe par une classe PHP qui me récupère la session de l’utilisateur et qui me fait les enregistrements qui vont bien dans la bdd. Bien entendu, par défaut les tests s’opèrent sur IE, et tout fonctionne à merveille, je suis heureux, puis au moment de déployer mon appli, je la test sous Firefox et là !!!! Pas moyen de récupérer la session de l’utilisateur.
Après quelques recherches sur le net il s’avère que c’est un problème connu depuis trèèèèèèès longtemps par les utilisateurs, mais surtout par Adobe !!! FileReference.upload ne permet pas de récupérer et d’utiliser les sessions PHP ou autres, et ce sur plusieurs navigateurs, en fait tous sauf IE !!! Incroyable non ? Sachant que l’argument premier pour attirer à la programmation flex (contre ajax par exemple) c’est que les applications sont compatibles et idem sur tous navigateurs… Mouai….
Bon, après plusieurs cafés, plusieurs recherches, quelques arrachages de cheveux et quelques heures perdus, j’ai pu rassembler une solution correct.
Voici la méthode avec AMF (AMFPHP entre autre) :
il suffit de renvoyer la session :
[pastacode lang= »php » manual= »%3C%3Fphp%0Asession_start()%3B%0A%0Aclass%20getUser%7B%0A%09%0A%09function%20getUser()%7B%0A%09%0A%09%09%5B…%5D%0A%09%09%09%09%09%09%09%09%0A%09%7D%0A%09%0A%09function%20serviceReturnSESSID()%7B%0A%09%09%0A%09%09return%20session_id()%3B%0A%09%0A%09%7D%0A%09%0A%7D%0A%0A%3F%3E » message= » » highlight= » » provider= »manual »/]
Puis de compléter l’url qui appelle la classe/méthode/fonction d’upload en php
[pastacode lang= »javascript » manual= »%2F%2F%20R%C3%A9cup%C3%A9ration%20de%20la%20session%20pour%20la%20passer%20%C3%A0%20l’upload%20(pb%20connu%20sous%20flash%2Fflex)%0Apublic%20function%20getUser()%3Avoid%7B%0A%0Avar%20servRO%3ARemoteObject%20%3D%20new%20RemoteObject%3B%0A%0AservRO.source%20%3D%20%22getUser%22%0AservRO.destination%20%3D%20%22amfphp%22%0AservRO.endpoint%20%3D%20%22http%3A%2F%2Flocalhost%2Famfphp%2Fgateway.php%22%0A%0AservRO.serviceReturnSESSID.addEventListener(%22result%22%2C%20getUserHandler)%3B%0AservRO.serviceReturnSESSID.addEventListener(%22fault%22%2C%20resultatKo)%3B%0A%0AservRO.serviceReturnSESSID()%3B%0A%0A%7D%0A%0A%2F%2F%20Si%20le%20retour%20de%20la%20recup%20de%20session%20n’a%20pas%20fonctionn%C3%A9%0Apublic%20function%20resultatKo(e%3AFaultEvent)%3Avoid%7B%0A%0A%2F%2F%20On%20affiche%20le%20probl%C3%A8me%0AAlert.show(e.fault.faultString%2C%20e.fault.faultCode.toString())%3B%0A%0A%7D%0A%0A%2F%2FOn%20r%C3%A9cup%C3%A8re%20le%20r%C3%A9sultat%20de%20la%20session%20de%20l’utilisateur%20puis%20on%20affecte%20cette%20valeur%20au%20fichier%20upload%20php%0Aprivate%20function%20getUserHandler(evt%3AResultEvent)%3Avoid%7B%0A%0AuserID%20%3D%20String(evt.result)%3B%0AuploadFile%20%3D%20’http%3A%2F%2Flocalhost%2Fupload.php%3Fsessidforupload%3D’%2BuserID%3B%0AfileUpload.init(uploadProgress%2C%20cancelUpload%2C%20uploadFile)%3B%0A%0A%7D » message= » » highlight= » » provider= »manual »/]
et dans le fichier php d’upload, rajouter en début :
[pastacode lang= »php » manual= »if(isset(%24_GET%5B’sessidforupload’%5D))%7B%0A%0Asession_id(%24_GET%5B’sessidforupload’%5D)%3B%0Asession_start()%3B%0A%0A%7D » message= » » highlight= » » provider= »manual »/]
Si vous avez des questions ou des doutes n’hésitez pas, si ça peut vous éviter de galérer sur un élément que je trouve hallucinant, surtout que ce bug date de bien avant 2008…
Bon code 😉
Articles qui pourraient vous intéresser :
Trackbacks/Pingbacks