Snabbtips Hämta filer via SWFs med FileReference

Den här snabba tipsen täcker hur du använder AS3s FileReference-klass för att ladda ner och spara externa filer från Flash RIA-filer utan att behöva använda skrivarsidor som PHP. Allt vi behöver är sökvägen till filen som vi vill låta användaren hämta.


Slutresultatförhandsvisning

Låt oss ta en titt på det slutliga resultatet vi ska arbeta för:


Steg 1: Skapa en ny ActionScript 3.0-fil

Skapa en ny .fla-fil och spara den i din projektmapp.


Steg 2: Förbereda användargränssnittet

För denna snabba tips skapade jag ett gränssnitt. Du kan ladda ner den från länken längst upp på sidan eller du kan skapa din egen.

I min .fla-fil finns tre bilder som representerar filtyperna och tre nedladdningsknappar som är Filmklipp Objekt

  • btn_img_download för miki-monk.jpg-filen
  • btn_mp3_download för filen some-audio.mp3
  • btn_txt_download för filen dummy-text.rtf

och en framdriftsbalk längst ner för att spåra nedladdningsframstegen som placeras på scenen.


Steg 3: Skapa dokumentklass

Vi skriver vår kod till en dokumentklassfil. Om du inte är bekant med Document Class kan du få relaterad information från en annan ActiveTuts + Quick Tip.

Låt oss skapa vår dokumentklassfil; klicka på Arkiv> Ny och välj "ActionScript 3.0-klass. Spara AS-filen till samma plats som din .fla-fil.

Länk din .fla-fil till ActionScript-filen som du skapade - skriv bara namnet på din AS-fil i det relaterade fältet i .fla-filen.


Steg 4: Användning Filreferens() i vår kod

Här är dokumentklassen som jag använde i denna snabba tips. Vänligen läs kommentarerna i koden för att förstå klassbeteendet.

 paket import flash.display.MovieClip; importera flash.display.Sprite; importera flash.events.MouseEvent; importera flash.events.ProgressEvent; importera flash.net.FileReference; importera flash.net.URLRequest; importera flash.text.TextField; importera flash.events.Event; public class FileRefTut utökar Sprite // Download Buttons på scenen.Vi måste definiera dem som offentliga variabler i vår dokumentklass för att kunna använda dem. // Annars får vi ett felmeddelande från Flash. public var btn_img_download: MovieClip, btn_txt_download: MovieClip, btn_mp3_download: MovieClip, mc_loaded: MovieClip; // Progress Bar public var mc_progress: MovieClip, // Dynamic TextField stannar under Progress Bar. txt_prog: TextField; // Arr_Links håller listan över filer. privat var Arr_Links: Array; // Standardväg där nedladdningen lagras. // Du ändrar det enligt din inställning. // Detta är i förhållande till SWF. privat var defaultPath: String = "assets /"; // Filnamn privat var urlName: String; // Instans av FileReference () Klass privat var fr: FileReference; // url av de begärda filerna privat var req: URLRequest; public function FileRefTut (): void // Ange knappenMode till true för att ändra muscurser till handikonen btn_img_download.buttonMode = btn_txt_download.buttonMode = btn_mp3_download.buttonMode = true; // Ange bredden på mc_loaded progress bar till 0 när det inte hämtas mc_loaded.scaleX = 0; // Skapa lista över filer som ska hämtas // Dessa filer måste vara i den mapp som anges som standardPath Arr_Links = ["miki-monk.jpg", "some-audio.mp3", "dummy-text.rtf"]; // Skapa ett förfrågningsobjekt req = ny URLRequest (); // Skapa en instans av FileReference Class fr = ny FileReference (); // ProgressEvent att skala Progress Bar // Vi måste lägga till ProgressEvent Listener baserat på utvecklingen av FileReference fr.addEventListener (ProgressEvent.PROGRESS, progressHandler); // Använd COMPLETE Event för att bestämma när nedladdningen är klar fr.addEventListener (Event.COMPLETE, completeHandler); // Händelselysare för nedladdning av knappar // När användaren klickar på någon nedladdningsknapp, ring nedladdningFile (e: MouseEvent) funktionen btn_img_download.addEventListener (MouseEvent.CLICK, downloadFile); btn_mp3_download.addEventListener (MouseEvent.CLICK, downloadFile); btn_txt_download.addEventListener (MouseEvent.CLICK, downloadFile);  privat funktion downloadFile (e: MouseEvent): void // ställa in nedladdningsbanan till variabeln urlName enligt klicka på knappen Nedladdningsknapp (e.target.name) case "btn_img_download": urlName = Arr_Links [0]; ha sönder; fallet "btn_mp3_download": urlName = Arr_Links [1]; ha sönder; fallet "btn_txt_download": urlName = Arr_Links [2]; ha sönder;  // ändra textmeddelande "framsteg" till "nedladdning" på txt_prog Dynamic TextFiled txt_prog.text = "downloading?"; // Tilldela url till req-variabeln req.url = defaultPath + urlName; // Nedladdning begärd fil fr.download (req);  privat funktion progressHandler (händelse: ProgressEvent): void // Vi skala progressionsfältet enligt ration av (event.bytesLoaded / event.bytesTotal) // Så när scaleX når 1, betyder det att nedladdningen är klar? mc_loaded.scaleX = (event.bytesLoaded / event.bytesTotal);  privat funktion completeHandler (händelse: händelse): void // återställningsfältet till 0 efter nedladdningen är klar mc_loaded.scaleX = 0; // ändra textmeddelande txt_prog.text = "download finished"; 

Som du kan se är nyckeln att använda Filreferens med en URLRequest, för att möjliggöra nedladdning av filer från vår server. I grund och botten behöver vi 3 saker:

  1. Skapa en instans av Filreferens Klass
  2.  privat var fr: FileReference;
  3. Skapa en instans av URLRequest Klass
  4.  privat var req: URLRequest;
  5. Tilldel filbanan till url parameter för URLRequest instans och call download-metod för FileReference Class
  6.  req.url = defaultPath + urlName; fr.download (req);

Obs! Om du vill hämta filer från en annan värd måste du sätta en crossdomain.xml filen till den värden. Låt oss säga, du lägger in din swf-fil www.host-a.com, och du vill ladda ner filer från www.host-b.com med din swf-fil på www.host-a.com. För att göra det behöver du permisson från www.host-b.com. Så måste du ladda upp en crossdomain.xml filen till www.host-b.com. Om du väckte lär dig mer om crossdomain.xml filer, det finns en annan bra snabb tips här.


Slutsats

I den här snabba tipset lärde vi oss att ladda ner filer från en server, via Flash, till det lokala systemet utan att behöva skrivarservrar som PHP. Hoppas du gillar den här snabba tipsen och tack för att du läste den. Om du har några frågor, vänligen släpp en kommentar nedan.