local No IP Script (new) Redirect Express Cube My Pix Post It rTournoit RSS/FEED
- All Blog - - IT Blog - - Tutorial - - Blog - - Download - - More -
20/03/10 - 10:38      Leçon FLEX N°1 : Upload File With AMFPHP

Dans le cadre du projet de mon stage je devait implémenter un upload de fichier. Pour ce faire il m'était nécessaire d'utiliser AMFPHP. Malheureusement , malgré tous les "tutoriels" que l'on peut trouver sur le net, aucuns de ceux-ci ne me satisfesaient et ou ne fonctionnent de manière correct.

Déplacer le fichier en "brut" est déjà hors de question. Il nous faut d'abord :
- Charger le fichier dans l'application FLEX.
- Transformer les données en Byte brute.
- Déplacer ceux-ci vers une classe AMFPHP , avec les informations ( nom du fichier ) et autres ( utilisateur auquel sera affecté le fichier).
- Reconstruire le fichier du coté serveur.


Aller hop let's go comme dirait Dora !

Voici tout d'abord notre code coté serveur AMFPHP :

<?php

function FileManager(){}

public function upload($level,$id_cont,$fileName, $byteArray )
{
$adata = $byteArray->data;
$folder = md5("".$level."".$id_cont."");
@mkdir ('../../files/'.$folder.'');
if(file_put_contents('../../files/'.$folder.'/'.$fileName.'',$adata))
{
return true;
}
else
{
return false;
}
}
}
?>


  • La fonction "upload" de "FileManager" recois 4 arguments. Les deux premiers servent a identifier un utilisateur pour lequel on va upper le fichier. On crée aussi le dossier pour celui-ci ( un md5 de "level" et "id_cont" )


  • La variable "filename" contiend juste le nom du fichier qu'on va upper.


  • La variable "byteArray" est la plus importante , car elle contiend les informations du fichier. Cette variable est aussi bidouillée par AMFPHP et qui reconnait la zone "data" de cette variable. C'est cette partie qui nous intéresse, que l'on va copier dans le fichier créé grâce à la fonction "file_put_contents".


  • Jusque la il fallait déja savoir le " $byteArray->data " ( trouvé grâce a google à la 25em pages ).

    Passons côté FLEX ou plutot côté AS3 :

    <mx:Script>
    <![CDATA[
    import mx.rpc.events.ResultEvent;
    import flash.events.Event;
    import flash.net.FileReference;
    import flash.net.URLRequest;
    import mx.controls.Alert;

    private var upl:FileReference = new FileReference();

    public var level:Number;
    public var id_cont:Number;

    private function send():void
    {
    upl.addEventListener(Event.COMPLETE, handleFileLoadedComplete);
    upl.addEventListener(Event.SELECT, loadingfile);
    upl.browse();
    }

    private function loadingfile(evt:Event)
    {
    upl.load();
    }

    private function handleFileLoadedComplete(evt:Event):void
    {
    var dat:ByteArray = new ByteArray();
    upl.data.readBytes(dat, 0, upl.data.length);
    FileManager.getOperation('upload').send(level,id_cont,upl.name,dat);
    }

    private function retour_upload(evt:ResultEvent):void
    {
    Alert.show(evt.result.toString());
    }
    ]]>
    </mx:Script>


  • La variable "upl" est un FileReference , connu par tous les dévelopeurs FLEX , on lui rajoute deux évènements : Lorsque l'utilisateur a sélectionné le fichier alors on "load()" , on charge le fichier dans la partie FLEX client. Le deuxième évènement intervient lorsque le chargement du fichier est fini , c'est la ou l'on appelle notre fonction qui va transmettre les Byte à AMFPHP..


  • La fonction "handleFileLoadedComplete" se déroule lorsque le fichier est donc bien chargé. On défini dès lors la variable qui va contenir les informations en Byte du fichier. Heureusement pour nous , "FileManager" contient la méthode qu'il conviens d'utiliser ( "readBytes()" ) qui va placer les "bytes" dans "dat". C'est la variable "dat" alors que l'on va passer dans "FileManager" de AMFPHP..


  • Vous pouvez utiliser les scripts tel quel, juste un bouton lorsque l'on clic dessus qui va appeler "send()"

    Et pour ceux qui sont fainéants , voici le code MXML pour la déclaration de l'objet "FileManager" :

    <mx:RemoteObject id="FileManager" destination="amfphp" source="FileManager">
    <mx:method name="upload"
    result="retour_upload(event)"/>
    </mx:RemoteObject>


    Voila tout est prêt à upper des fichier via AMFPHP. Le code si dessus est plus que complet et j'espère que cela vous aura aider ( contrairement aux autres tutoriel foireux du net !! ).

    Afficher les commentaires | Ecrire un commentaires | ( 334 )