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….

flex-upload

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 :

<?php
session_start();

class getUser{
	
	function getUser(){
	
		[...]
								
	}
	
	function serviceReturnSESSID(){
		
		return session_id();
	
	}
	
}

?>

 

Puis de compléter l’url qui appelle la classe/méthode/fonction d’upload en php

// Récupération de la session pour la passer à l'upload (pb connu sous flash/flex)
public function getUser():void{

var servRO:RemoteObject = new RemoteObject;

servRO.source = "getUser"
servRO.destination = "amfphp"
servRO.endpoint = "http://localhost/amfphp/gateway.php"

servRO.serviceReturnSESSID.addEventListener("result", getUserHandler);
servRO.serviceReturnSESSID.addEventListener("fault", resultatKo);

servRO.serviceReturnSESSID();

}

// Si le retour de la recup de session n'a pas fonctionné
public function resultatKo(e:FaultEvent):void{

// On affiche le problème
Alert.show(e.fault.faultString, e.fault.faultCode.toString());

}

//On récupère le résultat de la session de l'utilisateur puis on affecte cette valeur au fichier upload php
private function getUserHandler(evt:ResultEvent):void{

userID = String(evt.result);
uploadFile = 'http://localhost/upload.php?sessidforupload='+userID;
fileUpload.init(uploadProgress, cancelUpload, uploadFile);

}

et dans le fichier php d’upload, rajouter en début :

if(isset($_GET['sessidforupload'])){

session_id($_GET['sessidforupload']);
session_start();

}

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 :

Author: Franck Pertegas

Share This Post On

Trackbacks/Pingbacks

  1. Tweets that mention Flex – PHP – FileReference.upload – Upload et perte de session | LudiBlog -- Topsy.com - [...] This post was mentioned on Twitter by Ludik Te@m, sankouh. sankouh said: Je reviens vous proposer un article, ce…
  2. WordPress 3.0 – Thelonious est là ! | LudiBlog - [...] Flex – PHP – FileReference.upload – Upload et perte de session [...]
  3. WordPress 3 – Quelques Plugins testés et intéressants | LudiBlog - [...] Flex – PHP – FileReference.upload – Upload et perte de session [...]
  4. Flex – AMFPHP – 500 Internal Server Error | LudiBlog - [...] Flex – PHP – FileReference.upload – Upload et perte de session [...]

Submit a Comment

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *