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
