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 à fcng@googlegroups.com.
Pour vous désabonner de ce groupe, envoyez un e-mail à l'adresse 
fcng+unsubscr...@googlegroups.com.
Pour plus d'options, consultez la page de ce groupe : 
http://groups.google.com/group/fcng?hl=fr

Répondre à