J'ai commencé cette semaine à utiliser les nouvelles fonctionnalités de Flash 8. La classe
flash.net.FileReference en particulier. J'ai commencé par lire ce
tutoriel d'
Aggelos. Le code du côté de Flash s'est fait assez rapidement sans problèmes. Enfin, c'est ce que je croyais...
Pour le côté serveur, j'ai commencé par faire un action
Struts dont le rôle est d'uploader le fichier, créer une entré dans la BD, récupérer l'ID de cette entré et le retourné au SWF. C'est à ce moment que je me suis rendu compte qu'il n'avait aucun moyen de lire le contenu de la réponse de la requête HTTP utilisé pour l'upload (de la même façon qu'on le fait avec un LoadVars). J'ai dû procéder à un hack merdeu. Je stock l'ID dans une variable session et je fais un autre requête au serveur pour récupérer l'ID qui est dans la session. Ce qui entraine un autre problème...
Habituellement les requêtes HTTP faites par le FlashPlayer (LoadVars, XML, etc...) envoient les cookies du client au serveur. Ce qui permet de gérer les sessions. Mais... le FileReference d'envoi pas les cookies ! Il faut envoyer l'ID de session manuellement...
AS2file.upload("/monapplication/uploadFile.do;jsessionid=7480A780784A407F05D583C99B0AAB01?param1=toto¶m2=tata");
Pour récupérer l'ID de la session dans le SWF, je l'ajoute comme paramêtre dans le paramête
movie de l'élément
object dans le HTML.
L'upload semblait bien fonctionner, le fichier était bien copié sur le disque dur du serveur. Mais en fait ce n'était pas le bon fichier... J'avais réutilisé une classe d'upload que j'ai fait pour le même type d'application, sauf que le client était en Swing. J'envoyais les données binaires brutes directement dans le corps de la requête. Évidemment le flash player ne procède pas de cette façon. Les données sont envoyées en
multipart/form-data, ce qui est l'équivalent d'un formulaire d'upload HTML. J'ai donc modifié mon action struts en conséquence. J'ai réessayé à nouveau et là j'avais toujours une Exception qui était lancé :
Stream ended unexpectedly.
Comme si le Flash Player n'envoyait pas le fichier à uploader en entier. Après beaucoup de gossage. Je me suis rendu compte qu'en fait le Flash Player fait
deux requêtes au serveur lorsque l'on invoque la méthode
upload. La première est tout simplement une requête vide n'ayant même pas un octet ! Par contre la deuxième requête est la bonne. J'ai dû rajouter ce petit hack dans mon action Struts :
Javaif(request.getContentLength() == 0) return null;
J'ai finalement réussi à tout faire fonctionné, mais en beacoup plus long que prévu. Je me demande si cette classe à bien été testé ?