[AS3] Charger et enregistrer des fichiers locaux avec la classe FileReference

By admin on 02 novembre 2009 |

Avant Flash Player 10, il n'y avait pas moyen d'afficher un fichier directement dans flash avec la classe FileReference sans passer par un script serveur pour l'enregistrer et l'afficher ensuite.

Pour des raisons de sécurité, du code ActionScript dans Flash Player ne peut pas accéder directement au système de fichiers local pour ouvrir ou enregistrer un fichier.

Utilisant la technique décrite ci-dessous, le code affiche une boîte de dialogue , invitant l'utilisateur à sélectionner un fichier à ouvrir puis l'affiche à l'écran.

On ajoute un bouton sur la scene nommé upload_bt avec un label Parcourir
Puis on ajoute un MouseEvent.CLICK sur ce bouton qui déclenchera la fonction _parcourir

upload_bt.addEventListener(MouseEvent.CLICK, _parcourir);

private function _parcourir(p_evt:MouseEvent)
{
	_loadFile = new FileReference();
	_loadFile.addEventListener(Event.SELECT,_selectHandler);
	var fileFilter:FileFilter = new FileFilter("Images:(*.jpeg, *.jpg, *.gif, *.png)", "*.jpeg; *.jpg; *.gif; *.png");
	_loadFile.browse([fileFilter]);
}

Quand le fichier sera chargé la fonction selectHandler sera lancée.
C'est dans cette fonction que nous avions la possibilité d'enregistrer la fichier sur un serveur avec l'appel
de la fonction upload() de FileReference

Maintenant nous pouvons utiliser la fonction load() de FileReference comme ceci

private function _selectHandler(event:Event):void
{
	_loadFile.removeEventListener(Event.SELECT,_selectHandler);
           
	_loadFile.addEventListener(Event.COMPLETE,_loadCompleteHandler);
	_loadFile.load();
}

Lorsque vous utilisez la fonction load() d'un objet FileReference pour charger des données depuis un fichier, le contenu du fichier est chargé dans la propriété data de l'objet FileReference's. La propriété FileReference.data ByteArray est un objet contenant les données binaires brutes à partir du fichier.

Vous pouvez alors utiliser les méthodes de classe ByteArray pour lire le contenu du fichier et de l'utiliser dans votre application.

Dans cette exemple, nous ne voulons pas lire les parties du fichier de données, nous voulons juste d'utiliser les données pour afficher l'image sur l'écran.
Pour afficher les octets d'images brutes à l'écran, nous devons utiliser la méthode loadBytes de la classe Loader () de méthode. Nous passons les octets (comme un ByteArray) à l'objet Loader, et elle les utilise pour créer un objet d'affichage ActionScript DisplayObject.

private function _loadCompleteHandler(p_evt:Event):void
{
	_loadFile.removeEventListener(Event.COMPLETE,_loadCompleteHandler);
			
	var loader:Loader = new Loader();
			
	 loader.contentLoaderInfo.addEventListener(Event.COMPLETE,_loadBytesHandler);
	loader.loadBytes(_loadFile.data);
}
		
private function _loadBytesHandler(p_evt:Event):void
{
	var loaderInfo:LoaderInfo = (p_evt.target as LoaderInfo);
	loaderInfo.removeEventListener(Event.COMPLETE, _loadBytesHandler);
			
	_afficheImage(loaderInfo.content);
}

Puis on affiche l'image sur la scene

public function _afficheImage(imageClip:DisplayObject):void
{
	var _width = imageClip.width;
	var _height = imageClip.height;
			
	// Draw the image from the movie clip into a BitmapData object.
	var _bm:BitmapData = new BitmapData(imageClip.width, imageClip.height);
	_bm.draw(imageClip, new Matrix());
	var _bitmapImg:Bitmap = new Bitmap(_bm);
			
	// Display the bitmap
	addChild(_bitmapImg);
			
}

La démo est visible ici

Et les sources ici

On peux ensuite également enregistrer l'image ou une partie de l'image dans un fichier directement sur le disque dur de l'utilisateur.

Je vous présenterai çà dans un prochain article.

Vous pouvez en attendant tester le tutorial (en anglais) à cette adresse : 
http://www.adobe.com/devnet/flash/quickstart/filereference_class_as3/

Étiquettes: