:: Catégories

  • actionscript 3
  • Air
  • Flash
  • Flex
  • molehill
  • Non classé
  • papervision
  • Web

:: Derniers articles.

  • Nouveau Android Flash Game : Kick The Ducks !
  • Démo – Client FTP en Flex
  • Démo Molehill – particules
  • [TUTO] AS3 + APPARAT / TDSI, accélérez vos projets !
  • [FIXED] SecurityError: fileWriteResource
  • [Tutorial] Techniques d’optimisations en AS3
  • [Tutorial] Un client FTP en AS3 sous RoboLegs + SwfStudio – partie 2
  • [Tutorial] Un client FTP en AS3 sous RoboLegs + SwfStudio – partie 1

:: Tags

  • 3d actionscript3 ACTUce android as3 client code demo ducks Flash Flex flexunit framework ftp game jeux kick molehill optimisations particules robotlegs swfStudio tests unitaires the

:: Sites Exoa

  • Home
  • actionscript 3
  • Air
  • Flash
  • Flex
  • molehill
  • Non classé
  • papervision
  • Web

exoa labs

[Tutorial] Un client FTP en AS3 sous RoboLegs + SwfStudio – partie 2

5 commentaires - avr 2nd, 2010 - Flex, actionscript 3

Deuxième partie de notre tutorial sur la conception d’une application d’upload FTP avec RobotLegs. Nous avons fait le tour des vues et du model, voyons à présent la dernière vue « DragDropView » écoutant le glissé-déposé de fichiers puis les commandes et le service FTP.

Drag’n’Drop sous SwfStudio

La syntaxe swfStudio est assez particulière mais bon il suffit de bien lire la documentation et vous verrez que tous les objets fonctionnent de la même façon. Voici notre vue DragDropView :

  1.  
  2. <?xml version="1.0" encoding="utf-8"?>
  3. <mx:Canvas xmlns:fx="http://ns.adobe.com/mxml/2009"
  4. xmlns:s="library://ns.adobe.com/flex/spark"
  5. xmlns:mx="library://ns.adobe.com/flex/mx" width="100%" height="100%"
  6. creationComplete="init()">
  7. <fx:Script>
  8. <![CDATA[
  9. import controller.ClientEvent;
  10. protected function init():void
  11. {
  12. ssEvents.addEventListener ({listener : this,recurse:"true",event : "App.onDragDrop",callback : 'onDragDrop'});
  13. }
  14. public function onDragDrop(ret_obj)
  15. {
  16. ssDebug.trace("onDragAndDrop")
  17. ssDebug.trace(ret_obj.success)
  18. var files_dropped:Array=new Array();
  19. if (ret_obj.success)
  20. {
  21. var files = ret_obj.result.split("\r");
  22.  
  23. for (var i=0;i<files.length;i++)
  24. {
  25. var file=files[i];
  26. var tmpExt = file.substr((file.lastIndexOf(".")+1),file.length);
  27. var tmpName = file.substr((file.lastIndexOf('\\')+1),file.length);
  28. ssDebug.trace(file+" "+tmpName);
  29. // test if file type is allowed
  30. if (tmpExt == "mp3" || tmpExt == "jpg")
  31. {
  32. var file_obj:Object={name:tmpName, url:file};
  33. files_dropped.push(file_obj);
  34. }else{
  35. dispatchEvent(new ClientEvent(ClientEvent.ON_APPENED ,tmpName+" n'est pas autorisé "));
  36. //debugger("\n"+ tmpName+" n'est pas autorisé ");
  37. }
  38. }
  39. dispatchEvent(new ClientEvent(ClientEvent.ON_FILES_DROPPED ,files_dropped));
  40. }else{
  41. //debugger("ERROR ");
  42. }
  43. }
  44.  
  45. ]]>
  46. </fx:Script>
  47. </mx:Canvas>
  48.  

Ligne 12 : nous écoutons les éveênements « App.onDragDrop » qui correspondent au déposé de fichiers. La liste des fichiers récupérée arrive comme une chaîne. On la split, puis on vérifie que chaque fichier est autorisé. Pour l’exemple je n’autorise que les fichiers jpg et mp3. Si le fichier est autorisé on l’ajoute à la liste sinon on envoi une erreur à StatView à l’aide de ON_APPENED. Une fois la liste complète, on dispatch un évênement .ON_FILES_DROPPED récupérée par le médiateur et traité vers le model :

  1.  
  2. package view
  3. {
  4. import controller.ClientEvent;
  5.  
  6. import model.*;
  7.  
  8. import org.robotlegs.mvcs.Mediator;
  9.  
  10. public class DragDropViewMediator extends Mediator
  11. {
  12. [Inject]
  13. public var dragDropView:DragDropView;
  14.  
  15. [Inject]
  16. public var listingModel:ListingModel;
  17.  
  18. override public function onRegister():void {
  19.  
  20. eventMap.mapListener(dragDropView, ClientEvent.ON_FILES_DROPPED, onFilesDropped);
  21. eventMap.mapListener(dragDropView, ClientEvent.ON_APPENED, onAppened);
  22. }
  23. public function onFilesDropped(e:ClientEvent) {
  24. listingModel.addToList(e.retour);
  25. }
  26. public function onAppened(e:ClientEvent) {
  27. dispatch(new ClientEvent(ClientEvent.ON_APPENED,e.retour));
  28. }
  29. }
  30.  
  31. }
  32.  

On réutilise ici la fonction listingModel.addToList() vu précédement pour ajouter des éléments à notre ArrayCollection. Cette mise à jour est ensuite dispatchée automatique vers la vue ListingView qui l’utilise comme source de dataprovider.

Voyons à présent notre class FTPService :

  1.  
  2. package service {
  3. import controller.ClientEvent;
  4.  
  5. import exoa.server.FTPConnexion;
  6. import exoa.server.FTPConnexionEvent;
  7.  
  8. import flash.events.EventDispatcher;
  9. import flash.utils.setTimeout;
  10. import model.*;
  11.  
  12. import org.robotlegs.mvcs.Actor;
  13.  
  14. public class FTPService extends Actor {
  15. public var isUploading:Boolean;
  16. private var connexion:FTPConnexion;
  17.  
  18. [Inject]
  19. public var listingModel:ListingModel;
  20.  
  21. public function FTPService() {
  22.  
  23. connexion = new FTPConnexion();
  24. connexion.initialize("exoa.fr", "exoa_ftp_demo", "XXXX");
  25. connexion.addEventListener(FTPConnexionEvent.CONNECT_FAILED, onConnexionFailed);
  26. connexion.addEventListener(FTPConnexionEvent.CONNECTED, onConnexionSuccess);
  27. connexion.addEventListener(FTPConnexionEvent.CONNECTING, onConnexionLoading);
  28. connexion.addEventListener(FTPConnexionEvent.TRANSFER_ITEM_STARTING, onTransferItemStart);
  29. connexion.addEventListener(FTPConnexionEvent.TRANSFER_ITEM_PROGRESS, onTransferItemProgress);
  30. connexion.addEventListener(FTPConnexionEvent.TRANSFER_ITEM_COMPLETED, onTransferItemComplete);
  31. connexion.addEventListener(FTPConnexionEvent.TRANSFER_ITEM_FAILED, onTransferItemFail);
  32. }
  33. public function connect() {
  34. connexion.connect();
  35.  
  36. debugger("Connexion en cours...");
  37. }
  38. public function upload() {
  39. if(listingModel._listing.length>0){
  40. var obj:Object = listingModel._listing.getItemAt(0);
  41. connexion.uploadFile(obj);
  42. debugger("Démarrage de l'upload de " + obj.name);
  43. }else {
  44. debugger("Tous les uploads sont terminés !");
  45. }
  46. }
  47.  
  48. ///////////////////
  49. // ON CONNEXION
  50. ///////////////////
  51.  
  52. private function onConnexionLoading(e:FTPConnexionEvent):void
  53. {
  54. debugger("Connexion en cours")
  55. }
  56.  
  57. private function onConnexionSuccess(e:FTPConnexionEvent):void
  58. {
  59. debugger("Connexion FTP réussie")
  60. connexion.changeDir("/upload");
  61. }
  62.  
  63. private function onConnexionFailed(e:FTPConnexionEvent):void
  64. {
  65. debugger("La connexion au server FTP a échouée : "+e.retour.description)
  66. }
  67.  
  68. ///////////////////
  69. // ON TRANSFER ITEM
  70. ///////////////////
  71.  
  72. private function onTransferItemStart(e:FTPConnexionEvent):void
  73. {
  74. //debugger("Début du transfer.");
  75. }
  76. private function onTransferItemProgress(e:FTPConnexionEvent):void
  77. {
  78. dispatch(new FTPConnexionEvent(FTPConnexionEvent.TRANSFER_ITEM_PROGRESS,null,e.valeur));
  79. }
  80. private function onTransferItemComplete(e:FTPConnexionEvent):void
  81. {
  82. debugger("Le transfer est terminé !");
  83. listingModel._listing.removeItemAt(0);
  84. var num = setTimeout(upload, 400);
  85.  
  86. }
  87. private function onTransferItemFail(e:FTPConnexionEvent):void
  88. {
  89. debugger("Le transfer du fichier a échoué :"+e.retour.description);
  90. }
  91.  
  92. private function debugger(message:String) {
  93. dispatch(new ClientEvent(ClientEvent.ON_APPENED, message));
  94. }
  95. }
  96.  
  97. }

Cette classe fait office de passerelle avec une classe de connexion FTP, dont la syntaxe est encore bien spécifique à SwfStudio. Vous pouvez remarquer que même les classes de service héritent d’Actor ce qui leur permet d’émettre des évènements vers toute l’application avec dispatch(). Le fonctonnement de cette classe est simple. On injecte le singleton du model de donnée et pour chaque élément se trouvant dans la liste des fichier, on démarre une session d’upload, l’une après l’autre.
Finalement, deux classes dites « commandes » permettent de lancer les fonctionnalités du service. La classe LaunchFTPConnexion :

  1.  
  2. package controller
  3. {
  4. import service.FTPService;
  5. import org.robotlegs.mvcs.Command;
  6.  
  7. public class LaunchFTPConnexionCommand extends Command
  8. {
  9. [Inject]
  10. public var FTP:FTPService;
  11.  
  12. override public function execute():void
  13. {
  14. FTP.connect();
  15. }
  16. }
  17. }
  18.  

Et la classe LaunchUpload, sensiblement identique :

  1.  
  2. package controller
  3. {
  4. import service.FTPService;
  5. import org.robotlegs.mvcs.Command;
  6.  
  7. public class LaunchUploadCommand extends Command
  8. {
  9. [Inject]
  10. public var FTP:FTPService;
  11.  
  12. override public function execute():void
  13. {
  14. FTP.upload();
  15. }
  16. }
  17. }

Exportez maintenant votre projet swf, et lancez swfStudio. Ouvrez le projet FlexFTPClient.spf se trouvant dans l’archive des sources de ce tutorial, dans le dossier bin-release. Vérifiez que les plugins FTP et filesys sont bien sélectionnés, et cliquez sur BUILD, votre application est créer ! Vous pouvez personnaliser son aspect, ses fonctionnalités.

  • Télécharger l’application terminée
  • Télécharger les sources

    5 réponses par ici, Envi de dire quelque chose ?

    1. tit dit:

      Bonjour,

      Je ne connais pas swfstudio.
      Pourquoi l’utilise-t-on?

      Merci

      Note : Bouton « Commanter » serait à changer en « Commenter »

      avr 02, 2010, 15 h 59 min
    2. admin dit:

      swfStudio permet simplement de créer des applications exécutables et d’étendre les possibilités de flash. Dans ce cas précis cela me permet d’utiliser le protocole FTP, directement en AS3.

      avr 02, 2010, 16 h 32 min
    3. tit dit:

      Pourquoi n’utilises pas AIR?
      Sur stackoverflow, j’ai trouvé cela: http://stackoverflow.com/questions/63038/as3-ftp-programming-and-the-socket-and-bytearray-classes

      avr 02, 2010, 19 h 02 min
    4. admin dit:

      effectivement on peut passer par du socket, mais ça reste de la bidouille, il peut y’avoir des problèmes de policy file, d’encodage, et il faut utiliser byteArray pour le transfer des données. Alors que swfStudio, fourni un objet d’accès direct au FTP, le seul désavantages c’est que cela complie un « .exe » qui marche donc uniquement sous windows, mais selon moi, le .air à aussi un désavantage majeur, les gens ne savent en général pas comment on l’ouvre… De plus swfStudio est souvent méconnu des développeurs, donc ce tutorial peut être intéressant ;)

      avr 02, 2010, 8 h 35 min
    5. tit dit:

      ok merci, je regarderai swfstudio sij’ai besoin de créer un exe

      avr 02, 2010, 10 h 04 min

    Commenter




      WORKS

    • Travaux

      PRODUCTS

    • ZenBook
    • E-ZEN Galery
    • FlashConf
    • EXOA MP3-Player

      SERVICES

    • Application Facebook
    • Advergame
    • Site Web
    • Référencement
    • Hébergement
    • Graphisme
    • Bannières & Animations
    • Application Flash

      EXOA

    • Contact
    • A propos
    • CGV
    • Mentions Légales

    © 2012 exoa labs, SIRET :517 668 349 00015 · Tél : 06.25.59.18.68 · contact@exoa.fr