Flash Player 10 File Reference

Dieses Beispiel zeigt ein neues Feature des Flash Player 10, das unter dem Namen File Reference runtime access in den Release Notes aufgeführt ist. Damit kann ein Nutzer lokale Dateien direkt in eine Flashanwendung laden und auch Dateien lokal abspeichern. Bis zum Flash Player 9 musste man dafür auf ein serverseitiges Skript (z.B. PHP) zurückgreifen.

Um das Beispiel zu betrachten, wird die aktuelle Betaversion "Astro" des Flash Player 10 benötigt: File Reference Beispiel anschauen

Bei manchen Bilder scheint es (noch) Probleme zu geben. Also einfach ein bisschen ausprobieren, mit diesem Bild z.B. sollte es problemlos funktionieren. Einfach mit der rechten Maustaste vorher runterladen.

Die Beschreibung des Feature lautet:

File Reference runtime access — Bring users into the experience by letting them load files into your RIA. You can work with the content at runtime and even save it back when you are done through the browse dialog box. Files can be accessed as a byteArray or text using a convenient API in ActionScript without round-tripping to the server. You no longer have to know a server language or have access to a server to load or save files at runtime.

Wie man die lokalen Dateien lädt, habe ich bei bytearray.org in einem Kommentar von Pleh gefunden. Die Funktionieren zum Abspeichern war dann recht einfach herauszufinden. Beim Abspeichern bitte die Dateiendung hinzufügen (.jpg). Der Quellcode des kompletten Beispiels lautet:

XML:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <mx:Application
  3.     xmlns:mx="http://www.adobe.com/2006/mxml"
  4.     xmlns:test="*"
  5.     width="800" height="800" backgroundGradientColors="[#e8f9ff, #005571]"
  6.     creationComplete="creationCompleteHandler()"
  7. >
  8.  
  9.  
  10. <mx:Script>
  11.     <![CDATA[
  12.  
  13.  
  14.     import flash.display.*;
  15.     import flash.events.Event;
  16.     import flash.events.MouseEvent;
  17.     import flash.net.FileReference;
  18.     import flash.net.FileFilter;
  19.     import flash.utils.ByteArray;
  20.    
  21.     import mx.graphics.ImageSnapshot;
  22.     import mx.graphics.codec.*;
  23.  
  24.     // File Reference
  25.     private var myFileRef:FileReference;
  26.    
  27.     // Loader
  28.     private var loader:Loader;
  29.    
  30.     // ByteArray
  31.     private var myData:ByteArray;
  32.    
  33.     private var myMC:MovieClip;
  34.  
  35.  
  36.     private function creationCompleteHandler():void {
  37.  
  38.         // place holder for the picture
  39.         myUIComponent.x = 50;
  40.         myUIComponent.y = 300;
  41.        
  42.         // new FileReference
  43.         myFileRef = new FileReference();
  44.        
  45.         // event listeners for File Reference
  46.         myFileRef.addEventListener(Event.SELECT, selectFile);
  47.         myFileRef.addEventListener(Event.OPEN, openFile);
  48.        
  49.         // event listener for Buttons
  50.         myOpenButton.addEventListener(MouseEvent.CLICK,browserForFile);
  51.         mySaveButton.addEventListener(MouseEvent.CLICK,onClickSave);       
  52.     }
  53.  
  54.  
  55.  
  56.     private function browserForFile(e:Event):void{
  57.         myFileRef.browse([new FileFilter("All Formats (*.jpg,*.gif,*.png,*.swf)", "*.jpg;*.gif;*.png;*.swf")]);
  58.     }
  59.    
  60.  
  61.     private function selectFile(e:Event):void {
  62.         myFileRef['load']();
  63.     }
  64.  
  65.     private function openFile(e:Event):void {
  66.  
  67.        
  68.         // save file data in byte array
  69.         myData = myFileRef['data'];
  70.        
  71.         // new loader loads the byte array
  72.         loader = new Loader();
  73.         loader.loadBytes(myData);
  74.        
  75.         // add a MC to UIComponent
  76.         myMC = new MovieClip;
  77.         myMC.addChild(loader);
  78.         myUIComponent.addChild (myMC);
  79.        
  80.         // show save panel
  81.         mySavePanel.visible = true;
  82.     }
  83.  
  84.  
  85.     private function onClickSave(e:Event):void{
  86.        
  87.         // new bitmap data 
  88.         var bitmapData:BitmapData = new BitmapData(myMC.width, myMC.height, true, 0xffffff);
  89.         bitmapData.draw(myMC);
  90.        
  91.         var jpgEnc:JPEGEncoder = new JPEGEncoder();
  92.         var bytes:ByteArray = jpgEnc.encode(bitmapData);
  93.  
  94.  
  95.         // save byte array to disc
  96.         myFileRef.save(bytes);   
  97.  
  98.     }   
  99.  
  100.         ]]>
  101.  
  102.     </mx:Script>
  103.  
  104.  
  105.     <mx:HBox>
  106.             <mx:Panel title="Flash Player 10: FileReference Demo" width="300" height="180" headerColors="[0xc6d381, 0xc6d381]" paddingLeft="10" paddingTop="10" id="myPanel">
  107.                 <mx:Button label="Open local file" id="myOpenButton" />
  108.  
  109.            
  110.             </mx:Panel>
  111.    
  112.                 <mx:Panel title="Save as file ..." width="300" height="180" headerColors="[0xc6d381, 0xc6d381]" paddingLeft="10" paddingTop="10" id="mySavePanel" visible="false">
  113.                             <mx:Button label="Save as local JPG file" id="mySaveButton" />
  114.             </mx:Panel>
  115.     </mx:HBox>
  116.    
  117.  
  118.     <mx:UIComponent id="myUIComponent" />
  119.  
  120.    
  121. </mx:Application>

Link: Beispiel anschauen
Link: Thank you Astro! (bytearray.org)