Hello :)

pour les singletons tu devrais lire :

http://code.google.com/p/maashaack/wiki/Singleton

EKA+ :)

Le 21 mars 2011 15:35, Loyat Marc <[email protected]> a écrit :

> Salut,
>
> j'ai enfin pris le temps de mettre en place le système avec fragmentation
> de ByteArray. Comme le rappelait Benoit, on a besoin d'un événement
> utilisateur pour l'envoi avec URLLoader, je ne vois toujours pas comment
> envoyer des datas avec FileReference quand ces données ne viennent pas d'un
> browse(), du coup j'ai remis en place la solution avec AMF !
>
> Côté as3 j'ai fait un singleton pour l'envoi des fichier vers le serveur.
>
>
>
> package
> {
> import com.adobe.crypto.MD5;
>  import events.AMFEvent;
> import flash.events.Event;
> import flash.events.EventDispatcher;
>  import flash.events.ProgressEvent;
> import flash.utils.ByteArray;
>   public class Remote extends EventDispatcher
> {
>  /**
>  * instance unique du singleton
>  */
> private static var _instance:Remote;
>  /**
>  * geter du singleton
>  * @return
>  */
> public static function getInstance():Remote
> {
>  if(_instance == null) _instance = new Remote(new PrivateRemote());
>             return _instance;
> }
>    /**
>  * lorsqu'on envoie le fichier en plein de petits morceaux,
>  * on crée un identifiant unique qui permet de recoller les bouts de
> l'autre côté
>  */
> private var _token:String;
>  /**
>  * numéro du morceau envoyé
>  */
>  private var _part:uint;
>  /**
>  * nombre de morceaux envoyés
>  */
> private var _length:uint;
>  /**
>  * stockage du fichier complet
>  */
> private var _byteArray:ByteArray;
>  /**
>  * nombre de bytes à prendre par tranche
>  */
>  private var _slice:uint = 100000;
>  /**
>  * les paramètres à envoyer
>  */
> private var _params:Object;
>  private var _idMedia:int;
> private var _idGabarit:int;
> private var _extension:String;
>  /**
>  * constructeur
>  * @param pvt
>  */
>  public function Remote(pvt:PrivateRemote):void
> {
> if(pvt == null){
>  throw new Error("Error: Instantiation failed: Use getInstance() instead
> of new.");
> }
>  }
>  /**
>  * envoi d'une déclinaison au serveur
>  * @param aIdMedia
>  * @param aIdGabarit
>  * @param aExtension
>  * @param aData
>  */
>  public function saveDeclinaison(aIdMedia:int, aIdGabarit:int,
> aExtension:String, aData:ByteArray):void
> {
>  AMF.addEventListener(AMFEvent.COMPLETE, this._onComplete);
>  _token = MD5.hash("t" + (new Date()).getTime() + "_" +
> Math.round(Math.random() * 100000000));
> _part = 0;
>  _length = Math.ceil(aData.length / _slice);
> _byteArray = aData;
>  _idMedia = aIdMedia;
> _idGabarit = aIdGabarit;
> _extension = aExtension;
>  _sendSlice();
>  }
> /**
>  * envoie la partie suivante
>  */
> private function _sendSlice():void
> {
>  var vOffset:Number = _part * _slice;
> var vLength:Number = vOffset + _slice > _byteArray.length ?
> _byteArray.length - vOffset : _slice;
>  var vData:ByteArray = new ByteArray();
> _byteArray.position = vOffset;
>  _byteArray.readBytes(vData, 0, vLength);
>  AMF.call('saveDeclinaison', _idMedia, _idGabarit, _extension, vData,
> _token, _part, _length);
>  }
>   /**
>  * fin du chargement
>  * @param aEvent
>  */
> private function _onComplete(aEvent:AMFEvent):void
> {
>  //trace (aEvent.result);
>  if (_part < _length - 1) {
>  Preloader.update(Number(_part / _length));
> _part += 1;
> _sendSlice();
>  }
> else{
> Preloader.hide();
>  AMF.removeEventListener(AMFEvent.COMPLETE, this._onComplete);
> this.dispatchEvent(new Event(Event.COMPLETE));
>  }
> }
>   }
>
> }
>
>
> internal class PrivateRemote {}
>
>
> --------------------------
> Et côté php (j'utilise le zend framework et Zend_AMF)
>
>
> /**
>  * sauve l'image et crée la déclinaison dans la base avec upload du fichier
> en plusieurs morceaux
>  * @param int $idMedia
>  * @param int $idGabarit
>  * @param string $extension
>  * @param $aData données du fichier
>  * @param string $token identificateur du fichier en cours d'upload
>  * @param int $part numéro du fragment en cours d'upload
>  * @param int $length nb de fragments de fichiers à uploader
>   */
> public function saveDeclinaison($idMedia, $idGabarit, $extension, $aData,
> $token, $part, $length){
>  // upload en plusieurs morceaux
>         $tmpFileName = MEDIA_PATH.'/tmp'.$token;
>         file_put_contents($tmpFileName, $aData, FILE_APPEND);
>         if ($part == $length-1){
>          $aData = file_get_contents($tmpFileName);
>          unlink($tmpFileName);
>        // enregistrement
> $media_occ = new Default_Model_Media();
> $media_occ->find($idMedia);
>  $media_occ->deleteDeclinaison($idGabarit);
> $media_occ->createDeclinaison($idGabarit, $extension, $aData);
>         }
>
> }
>
> ---------------------
>
> Bon, ça marche, les utilisateurs vont être contents, mais ça fait beaucoup
> d'allers/retours ! :-)
>
>
> @Eka, je viens de me rendre compte que mon précédent message n'a été
> adressé qu'à toi, désolé, c'était une erreur de ma part !
>
>
> A+
>
>  --
> Vous recevez ce message, car vous êtes abonné au groupe Google
> Groupes FCNG.
> Pour envoyer un message à ce groupe, adressez un e-mail à
> [email protected].
> Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse
> [email protected].
> Pour plus d'options, consultez la page de ce groupe :
> http://groups.google.com/group/fcng?hl=fr
>

-- 
Vous recevez ce message, car vous êtes abonné au groupe Google Groupes FCNG.
Pour envoyer un message à ce groupe, adressez un e-mail à [email protected].
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse 
[email protected].
Pour plus d'options, consultez la page de ce groupe : 
http://groups.google.com/group/fcng?hl=fr

Répondre à