Använda klassen FileReference

Flash Player 9 och senare, Adobe AIR 1.0 och senare

Ett FileReference-objekt representerar en datafil på en klient- eller serverdator. Med metoderna för klassen FileReference kan du låta programmet läsa in och spara datafiler lokalt, och överföra fildata till och från fjärrservrar.

Med klassen FileReference kan du läsa in, överföra och spara datafiler på två olika sätt. Klassen FileReference har sedan den introducerades innehållit metoderna browse(), upload() och download(). Använd metoden browse() om du vill låta användaren välja en fil. Använd metoden upload() om du vill överföra filens data till en fjärrserver. Använd metoden download() om du vill hämta data från servern och spara dem i en lokal fil. Från och med Flash Player 10 och Adobe AIR 1.5 innehåller klassen FileReference även metoderna load() och save(). Med metoderna load() och save() kan du även få åtkomst till och spara lokala filer direkt. Användningen av dessa metoder påminner om metoderna med samma namn i klasserna URLLoader och Loader.

Obs! Klassen File, som utökar klassen FileReference, och klassen FileStream innehåller ytterligare funktioner för att arbeta med filer och det lokala filsystemet. Klasserna File och FileStream stöds bara i AIR, inte i Flash Player.

FileReference-klass

Varje FileReference-objekt representerar en enskild datafil på den lokala datorn. Egenskaperna för klassen FileReference innehåller information om filens storlek, typ, namn, filnamnstillägg, datum när den skapades och ändringsdatum.

Obs! Egenskapen creator stöds bara på Mac OS. Alla övriga plattformar returnerar null.
Obs! Egenskapen extension stöds endast i Adobe AIR.

Du kan skapa en instans av klassen FileReference på två olika sätt:

  • Använda operatorn new så som visas i följande kod:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Anropa metoden FileReferenceList.browse() som öppnar en dialogruta där användaren ombeds välja en eller flera filer som ska överföras. Sedan skapas en array med FileReference-objekt om användaren väljer en eller flera filer.

När du har skapat ett FileReference-objekt kan du göra följande:

  • Anropa metoden FileReference.browse() som öppnar en dialogruta där användaren ombeds välja en enda fil från det lokala filsystemet. Detta sker vanligtvis före ett efterföljande anrop till metoden FileReference.upload() eller FileReference.load(). Anropa metoden FileReference.upload() om du vill skicka filen till en fjärrserver. Anropa metoden FileReference.load() om du vill öppna en lokal fil.

  • Anropa metoden FileReference.download(). Metoden download öppnar en dialogruta, där användaren kan välja den plats där en ny fil sparas. Sedan överförs data från servern och de lagras i den nya filen.

  • Anropa metoden FileReference.load(). Den här metoden börjar läsa in data från en fil som tidigare valts med metoden browse(). Metoden load() kan inte anropas förrän browse()-åtgärden slutförts (användaren väljer en fil).

  • Anropa metoden FileReference.save(). Den här metoden öppnar en dialogruta och uppmanar användaren att välja en filplats i det lokala filsystemet. Metoden sparar sedan data på den angivna platsen.

Obs! Du kan bara köra en browse()-, download()- eller save()-åtgärd åt gången eftersom bara en dialogruta kan vara öppen i taget.

FileReference-objektegenskaperna, till exempel name, size och modificationDate, definieras inte förrän något av följande inträffar:

  • Metoden FileReference.browse() eller metoden FileReferenceList.browse() har anropats, och användaren har valt en fil i dialogrutan.

  • Metoden FileReference.download() har anropats, och användaren har angett en plats för en ny fil i dialogrutan.

Obs! Vid nedladdning fylls bara egenskapen FileReference.name i innan nedladdningen är klar. När filen har laddats ned är alla egenskaper tillgängliga.

När anropen till metoden FileReference.browse(), FileReferenceList.browse(), FileReference.download(), FileReference.load() eller FileReference.save() körs fortsätter uppspelningen av SWF-filen i de flesta spelare, och händelser skickas och kod körs.

Vid både överföring och nedladdning kan en SWF-fil bara komma åt filer i sin egen domän, inklusive de domäner som anges med en principfil. Du måste lägga upp en principfil på servern som innehåller filen om servern inte finns i samma domän som SWF-filen som initierar överföringen eller hämtningen.

Se även FileReference.

Läsa in data från filer

Med metoden FileReference.load() kan du läsa in data från en lokal fil till minnet.

Obs! Koden måste först anropa metoden FileReference.browse() så att användaren kan välja vilken fil som ska läsas in. Den här begränsningen gäller inte innehåll som körs i Adobe AIR i programmets säkerhetssandlåda

Metoden FileReference.load() returneras omedelbart efter att den anropats, men informationen som läses in är inte tillgänglig direkt. FileReference-objektet skickar händelser för att anropa avlyssnarmetoder vid varje steg i inläsningsprocessen.

FileReference-objektet skickar följande händelser under inläsningen.

  • open event (Event.OPEN): Skickas när inläsningen startar.

  • progress event (ProgressEvent.PROGRESS): Skickas regelbundet allt eftersom byte med data läses in från filen.

  • complete event (Event.COMPLETE): Skickas när inläsningsåtgärden har slutförts.

  • ioError event (IOErrorEvent.IO_ERROR): Skickas om inläsningen misslyckas på grund av ett I/O-fel som inträffar när filen öppnas eller när data läses från filen.

När FileReference-objektet skickar hela händelsen blir den inlästa informationen tillgänglig som en ByteArray i FileReference-objektets dataegenskap.

I följande exempel visas hur du uppmanar användaren att välja en fil och sedan läsa in data från den filen i minnet:

package 
{ 
     import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample1 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample1() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            trace(fileRef.data); 
        } 
 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

Exempelkoden skapar först FileReference-objektet fileRef och anropar sedan objektets browse()-metod. Metoden browse() öppnar en dialogruta, som uppmanar användaren att välja en fil. När en fil har valts anropar koden metoden onFileSelected(). Den här metoden lägger till lyssnare för händelserna progress och complete och anropar sedan FileReference-objektets load()-metod. De andra hanterarmetoderna i exemplet returnerar bara meddelanden om inläsningens förlopp. När inläsningen är klar visas innehållet i den inlästa filen med hjälp av metoden trace().

I Adobe AIR erbjuder klassen FileStream ytterligare funktioner för att läsa data från en lokal fil. Du hittar mer information i Läsa och skriva filer.

Spara data i lokala filer

Med metoden FileReference.save() kan du spara data i en lokal fil. Den börjar med att öppna en dialogruta där användaren kan ange ett nytt filnamn och en plats där filen ska sparas. När användaren har valt filnamn och plats sparas data i den nya filen. När filen har sparats fylls egenskaperna i FileReference-objektet i med egenskaperna för den lokala filen.

Obs! Koden kan bara anropa metoden FileReference.save() som svar på en användarinitierad händelse, till exempel en musklicks- eller tangentbordshändelse. Annars returneras ett fel. Den här begränsningen gäller inte innehåll som körs i Adobe AIR i programmets säkerhetssandlåda.

Metoden FileReference.save() returneras omedelbart efter att den anropats. FileReference-objektet skickar sedan händelser för att anropa avlyssnarmetoder vid varje steg medan filen sparas.

FileReference-objektet skickar följande händelser medan filen sparas.

  • select event (Event.SELECT): Skickas när användaren anger plats och filnamn för den nya filen som ska sparas.

  • cancel event (Event.CANCEL): Skickas när användaren klickar på knappen Avbryt i dialogrutan.

  • open event (Event.OPEN): Skickas när filen har sparats.

  • progress event (ProgressEvent.PROGRESS): Skickas regelbundet allt eftersom byte med data sparas i filen.

  • complete event (Event.COMPLETE): Skickas när spara-åtgärden har slutförts.

  • ioError event (IOErrorEvent.IO_ERROR): Skickas om det inte går att spara på grund av ett I/O-fel som inträffar när data ska sparas i filen.

Den typ av objekt som skickas i data-parametern för metoden FileReference.save() avgör hur informationen skrivs till filen:

  • Om det är ett String-värde sparas informationen som en textfil med UTF-8-kodning.

  • Om det är ett XML-objekt skrivs informationen till en fil i XML-format med all formatering bevarad.

  • Om det är ett ByteArray-objekt skrivs innehållet direkt till filen utan konvertering.

  • Om det är någon annan typ av objekt anropar metoden FileReference.save() objektets toString()-metod och sparar sedan det resulterande String-värdet i en UTF-8-textfil. Om objektets toString()-metod inte kan anropas returneras ett fel.

Om värdet på data-parametern är null returneras ett fel.

Följande kod bygger på exemplet som beskrivs ovan för metoden FileReference.load(). När data har lästs från filen uppmanar exempelkoden användaren att ange ett filnamn och sparar sedan data i en ny fil:

package 
{ 
    import flash.display.Sprite; 
    import flash.events.*;  
    import flash.net.FileFilter; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.utils.ByteArray; 
 
    public class FileReferenceExample2 extends Sprite 
    { 
        private var fileRef:FileReference; 
        public function FileReferenceExample2() 
        { 
            fileRef = new FileReference(); 
            fileRef.addEventListener(Event.SELECT, onFileSelected); 
            fileRef.addEventListener(Event.CANCEL, onCancel); 
            fileRef.addEventListener(IOErrorEvent.IO_ERROR, onIOError); 
            fileRef.addEventListener(SecurityErrorEvent.SECURITY_ERROR, 
                        onSecurityError); 
            var textTypeFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", 
                        "*.txt;*.rtf"); 
            fileRef.browse([textTypeFilter]); 
        } 
        public function onFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.addEventListener(Event.COMPLETE, onComplete); 
            fileRef.load(); 
        } 
 
        public function onProgress(evt:ProgressEvent):void 
        { 
            trace("Loaded " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
        public function onCancel(evt:Event):void 
        { 
            trace("The browse request was canceled by the user."); 
        } 
        public function onComplete(evt:Event):void 
        { 
            trace("File was successfully loaded."); 
            fileRef.removeEventListener(Event.SELECT, onFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onComplete); 
            fileRef.removeEventListener(Event.CANCEL, onCancel); 
            saveFile(); 
        } 
        public function saveFile():void 
        { 
            fileRef.addEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.save(fileRef.data,"NewFileName.txt"); 
        } 
 
        public function onSaveFileSelected(evt:Event):void 
        { 
            fileRef.addEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.addEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.addEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveProgress(evt:ProgressEvent):void 
        { 
            trace("Saved " + evt.bytesLoaded + " of " + evt.bytesTotal + " bytes."); 
        } 
         
        public function onSaveComplete(evt:Event):void 
        { 
            trace("File saved."); 
            fileRef.removeEventListener(Event.SELECT, onSaveFileSelected); 
            fileRef.removeEventListener(ProgressEvent.PROGRESS, onSaveProgress); 
            fileRef.removeEventListener(Event.COMPLETE, onSaveComplete); 
            fileRef.removeEventListener(Event.CANCEL, onSaveCancel); 
        } 
 
        public function onSaveCancel(evt:Event):void 
        { 
            trace("The save request was canceled by the user."); 
        } 
 
        public function onIOError(evt:IOErrorEvent):void 
        { 
            trace("There was an IO Error."); 
        } 
        public function onSecurityError(evt:Event):void 
        { 
            trace("There was a security error."); 
        } 
    } 
}

När alla data har lästs in från filen anropar koden metoden onComplete(). Metoden onComplete() tar bort lyssnarna för inläsningshändelserna och anropar sedan metoden saveFile(). Metoden saveFile() anropar metoden FileReference.save(). Metoden FileReference.save() öppnar en ny dialogruta där användaren kan ange ett nytt filnamn och en plats där filen ska sparas. Resten av händelseavlyssnarmetoderna spårar förloppet när filen sparas tills detta är klart.

I Adobe AIR erbjuder klassen FileStream ytterligare funktioner för att skriva data till en lokal fil. Du hittar mer information i Läsa och skriva filer.

Överföra filer till en server

Om du vill överföra filer till en server anropar du först metoden browse() så att användaren kan välja en eller flera filer. Sedan, när metoden FileReference.upload() anropas, överförs den valda filen till servern. Om användaren väljer flera filer med hjälp av metoden FileReferenceList.browse() skapar Flash Player en array med de valda filerna vid namn FileReferenceList.fileList. Du kan sedan använda metoden FileReference.upload() för att överföra varje fil för sig.

Obs! Metoden FileReference.browse() gör att du bara kan överföra enskilda filer. Om du vill tillåta att användare kan överföra flera filer använder du metoden FileReferenceList.browse().

Som standard kan användare välja valfri filtyp på den lokala datorn i dialogrutan för att välja fil. Utvecklare kan ange en eller flera anpassade filtypsfilter genom klassen FileFilter och skicka en array av filterinstanser för filer till metoden browse():

var imageTypes:FileFilter = new FileFilter("Images (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textTypes:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var allTypes:Array = new Array(imageTypes, textTypes); 
var fileRef:FileReference = new FileReference(); 
fileRef.browse(allTypes);

När användaren har valt filer och klickat på knappen Öppna i systemets filväljare, skickas händelsen Event.SELECT. Om metoden FileReference.browse() används för att välja filen som ska överföras skickas filen till en webbserver med följande kod:

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
try 
{ 
    var success:Boolean = fileRef.browse(); 
} 
catch (error:Error) 
{ 
    trace("Unable to browse for files."); 
} 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm") 
    try 
    { 
        fileRef.upload(request); 
    } 
    catch (error:Error) 
    { 
        trace("Unable to upload file."); 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}
Du kan skicka data till servern med metoden FileReference.upload() genom att använda egenskaperna URLRequest.method och URLRequest.data för att skicka variabler med hjälp av metoden POST eller GET.

När du försöker överföra en fil med hjälp av metoden FileReference.upload() skickas följande händelser:

  • open event (Event.OPEN): Skickas när överföringen startar.

  • progress event (ProgressEvent.PROGRESS): Skickas regelbundet allt eftersom byte med data överförs.

  • complete event (Event.COMPLETE): Skickas när överföringen har slutförts.

  • httpStatus event (HTTPStatusEvent.HTTP_STATUS): Skickas när överföringen misslyckas på grund av ett HTTP-fel.

  • httpResponseStatus event (HTTPStatusEvent.HTTP_RESPONSE_STATUS): Skickas om ett anrop till metoden upload() eller uploadUnencoded() försöker få åtkomst till data via HTTP, och Adobe AIR upptäcker och returnerar statuskoden för begäran.

  • securityError-händelse (SecurityErrorEvent.SECURITY_ERROR): Skickas om en överföring misslyckas på grund av en säkerhetsöverträdelse.

  • uploadCompleteData event (DataEvent.UPLOAD_COMPLETE_DATA): Skickas när data har tagits emot från servern efter en slutförd överföring.

  • ioError event (IOErrorEvent.IO_ERROR): Skickas om överföringen misslyckas på grund av någon av följande orsaker:

    • Ett in-/utdatafel inträffade när Flash Player läser, skriver eller skickar filen.

    • SWF-filen försökte att överföra en fil till en server som kräver verifiering (till exempel användarnamn och lösenord). Under överföring kan inte användaren ange lösenord i Flash Player.

    • Parametern url innehåller ett ogiltigt protokoll. Metoden FileReference.upload() måste använda antingen HTTP eller HTTPS.

Flash Player erbjuder inte fullständigt stöd för servrar som kräver verifiering. Bara SWF-filer som körs i en webbläsare med hjälp av webbläsarplugin-programmet eller Microsoft ActiveX®-kontrollen kan erbjuda en dialogruta där användaren uppmanas att ange användarnamn och lösenord för verifiering, och då bara för nedladdning. För överföring med plugin-programmet eller med ActiveX-kontrollen och för överföring/nedladdning med en fristående eller extern spelare misslyckas filöverföringen.

Om du vill skapa ett serverskript i ColdFusion för att godta en filöverföring från Flash Player kan du använda kod som följande:

<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />

Den här ColdFusion-koden överför filen som har skickats av Flash Player och sparar den i samma katalog som ColdFusion-mallen. Om katalogen redan innehåller en fil med samma namn, skrivs den filen över. Ovanstående kod visar den minsta mängd kod som krävs för att godta en filöverföring. Skriptet bör inte användas i verkliga produktionsmiljöer. Bäst är att lägga till datavalidering för att se till att användare endast överför giltiga filtyper, till exempel en bild i stället för ett potentiellt farligt serverskript.

Koden nedan visar filöverföringar med hjälp av PHP, och inkluderar datavalidering. Skriptet begränsar antalet överförda filer i överföringskatalogen till 10, vilket garanterar att filen är mindre än 200 kB, och tillåter bara att JPEG-, GIF- och PNG-filer överförs till och sparas i filsystemet.

<?php 
$MAXIMUM_FILESIZE = 1024 * 200; // 200KB 
$MAXIMUM_FILE_COUNT = 10; // keep maximum 10 files on server 
echo exif_imagetype($_FILES['Filedata']); 
if ($_FILES['Filedata']['size'] <= $MAXIMUM_FILESIZE) 
{ 
    move_uploaded_file($_FILES['Filedata']['tmp_name'], "./temporary/".$_FILES['Filedata']['name']); 
    $type = exif_imagetype("./temporary/".$_FILES['Filedata']['name']); 
    if ($type == 1 || $type == 2 || $type == 3) 
    { 
        rename("./temporary/".$_FILES['Filedata']['name'], "./images/".$_FILES['Filedata']['name']); 
    } 
    else 
    { 
        unlink("./temporary/".$_FILES['Filedata']['name']); 
    } 
} 
$directory = opendir('./images/'); 
$files = array(); 
while ($file = readdir($directory)) 
{ 
    array_push($files, array('./images/'.$file, filectime('./images/'.$file))); 
} 
usort($files, sorter); 
if (count($files) > $MAXIMUM_FILE_COUNT) 
{ 
    $files_to_delete = array_splice($files, 0, count($files) - $MAXIMUM_FILE_COUNT); 
    for ($i = 0; $i < count($files_to_delete); $i++) 
    { 
        unlink($files_to_delete[$i][0]); 
    } 
} 
print_r($files); 
closedir($directory); 
 
function sorter($a, $b) 
{ 
    if ($a[1] == $b[1]) 
    { 
        return 0; 
    } 
    else 
    { 
        return ($a[1] < $b[1]) ? -1 : 1; 
    } 
} 
?>

Du kan skicka ytterligare variabler till överföringsskriptet med hjälp av förfrågningsmetoden POST eller GET. Om du vill skicka ytterligare POST-variabler till överföringsskriptet kan du använda följande kod:

var fileRef:FileReference = new FileReference(); 
fileRef.addEventListener(Event.SELECT, selectHandler); 
fileRef.addEventListener(Event.COMPLETE, completeHandler); 
fileRef.browse(); 
function selectHandler(event:Event):void 
{ 
    var params:URLVariables = new URLVariables(); 
    params.date = new Date(); 
    params.ssid = "94103-1394-2345"; 
    var request:URLRequest = new URLRequest("http://www.yourdomain.com/FileReferenceUpload/fileupload.cfm"); 
    request.method = URLRequestMethod.POST; 
    request.data = params; 
    fileRef.upload(request, "Custom1"); 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

Ovanstående exempel skapar ett URLVariables-objekt som du skickar till fjärrskriptet på servern. I tidigare versioner av ActionScript kunde du skicka variabler till överföringsskriptet på servern genom att skicka värden i frågesträngen. I ActionScript 3.0 kan du skicka variabler till fjärrskriptet med hjälp av ett URLRequest-objekt, som låter dig skicka data med metoden POST eller GET, vilket i sin tur gör det möjligt att enkelt och smidigt skicka större mängder data. För att kunna ange om variablerna skickas med förfrågningsmetoden GET eller POST kan du ställa in egenskapen URLRequest.methodURLRequestMethod.GET respektive URLRequestMethod.POST.

I ActionScript 3.0 kan du även åsidosätta standardfältnamnet på överföringsfilen, Filedata, genom att ange en andra parameter för metoden upload(), som i föregående exempel (som ersatte standardvärdet Filedata med Custom1).

Flash Player gör som standard inte någon testöverföring, men du kan kringgå detta genom att skicka värdet true som en tredje parameter till metoden upload(). Syftet med testöverföringen är att kontrollera att den riktiga filöverföringen och serververifieringen (om någon) kommer att lyckas.

Obs! Testöverföring går än så länge bara att göra på Windows-baserade Flash Player.

I serverskriptet som hanterar filöverföringen bör en HTTP POST-begäran ingå med följande element:

  • Content-Type med värdet multipart/form-data.

  • Content-Disposition med ett name-attribut inställt på Filedata och ett filename-attribut inställt på originalfilens namn. Du kan ange ett anpassat name-attribut genom att skicka ett värde för parametern uploadDataFieldName i metoden FileReference.upload().

  • Filens binära innehåll

Här följer ett exempel på en HTTP POST-begäran:

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6  
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Filedata"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
Test File  
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
(actual file data,,,)

Följande exempel på HTTP POST-begäran skickar tre POST-variabler: api_sig, api_key och auth_token, och använder ett anpassat namnvärde för överföringsdatafält (photo):

POST /handler.asp HTTP/1.1 
Accept: text/* 
Content-Type: multipart/form-data; 
boundary=----------Ij5ae0ae0KM7GI3KM7ei4cH2ei4gL6 
User-Agent: Shockwave Flash 
Host: www.mydomain.com 
Content-Length: 421 
Connection: Keep-Alive 
Cache-Control: no-cache 
 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Filename" 
 
sushi.jpg 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_sig" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="api_key" 
 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="auth_token" 
 
XXXXXXXXXXXXXXXXXXXXXXX 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="photo"; filename="sushi.jpg" 
Content-Type: application/octet-stream 
 
(actual file data,,,) 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7 
Content-Disposition: form-data; name="Upload" 
 
Submit Query 
------------Ij5GI3GI3ei4GI3ei4KM7GI3KM7KM7--

Laddar ned filer från en server

Du kan låta användare ladda ned filer från en server med hjälp av metoden FileReference.download(), som tar två parametrar: request och defaultFileName. Den första parametern är URLRequest-objektet som innehåller webbadressen för filen som ska laddas ned. Den andra parametern är valfri och gör att du kan ange ett standardnamn som visas i nedladdningsdialogrutan. Om du utelämnar den andra parametern, defaultFileName, används filnamnet från den angivna webbadressen.

Följande kod hämtar en fil med namnet index.xml från samma katalog som SWF-filen:

var request:URLRequest = new URLRequest("index.xml"); 
var fileRef:FileReference = new FileReference(); 
fileRef.download(request);

Om du vill ställa in standardnamnet till currentnews.xml i stället för index.xml anger du parametern defaultFileName som i följande utdrag:

var request:URLRequest = new URLRequest("index.xml"); 
var fileToDownload:FileReference = new FileReference(); 
fileToDownload.download(request, "currentnews.xml");

Det kan vara bra att ändra namnet på filen om serverfilnamnet inte är intuitivt eller om det genererades av servern. Det är även bra att uttryckligen ange parametern defaultFileName när du laddar ned en fil med hjälp av ett skript på servern i stället för att ladda ned filen direkt. Du måste till exempel ange parametern defaultFileName om du har ett skript på servern som laddar ned specifika filer baserat på vilka URL-variabler som skickas till det. Annars är standardnamnet på den nedladdade filen detsamma som namnet på skriptet på servern.

Data kan skickas till servern med hjälp av metoden download() genom att bifoga parametrar till webbadressen som serverskriptet ska analysera. Följande ActionScript 3.0-utdrag laddar ned ett dokument baserat på vilka parametrar som skickas till ett ColdFusion-skript:

package 
{ 
    import flash.display.Sprite; 
    import flash.net.FileReference; 
    import flash.net.URLRequest; 
    import flash.net.URLRequestMethod; 
    import flash.net.URLVariables; 
 
    public class DownloadFileExample extends Sprite 
    { 
        private var fileToDownload:FileReference; 
        public function DownloadFileExample() 
        { 
            var request:URLRequest = new URLRequest(); 
            request.url = "http://www.[yourdomain].com/downloadfile.cfm"; 
            request.method = URLRequestMethod.GET; 
            request.data = new URLVariables("id=2"); 
            fileToDownload = new FileReference(); 
            try 
            { 
                fileToDownload.download(request, "file2.txt"); 
            } 
            catch (error:Error) 
            { 
                trace("Unable to download file."); 
            } 
        } 
    } 
}

Följande kod visar ColdFusion-skriptet, download.cfm, som laddar ned en av två filer från servern beroende på en URL-variabels värde:

<cfparam name="URL.id" default="1" /> 
<cfswitch expression="#URL.id#"> 
    <cfcase value="2"> 
        <cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" /> 
    </cfcase> 
    <cfdefaultcase> 
        <cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" /> 
    </cfdefaultcase> 
</cfswitch>

Klassen FileReferenceList

Klassen FileReferenceList gör att användaren kan välja en eller flera filer som ska överföras till ett skript på servern. Filöverföringen hanteras av metoden FileReference.upload(), som måste anropas för varje fil som användaren väljer.

Följande kod skapar två FileFilter-objekt (imageFilter och textFilter) och skickar dem i en array till metoden FileReferenceList.browse(). Detta gör att operativsystemets fildialogruta innehåller två möjliga filter för filtyper.

var imageFilter:FileFilter = new FileFilter("Image Files (*.jpg, *.jpeg, *.gif, *.png)", "*.jpg; *.jpeg; *.gif; *.png"); 
var textFilter:FileFilter = new FileFilter("Text Files (*.txt, *.rtf)", "*.txt; *.rtf"); 
var fileRefList:FileReferenceList = new FileReferenceList(); 
try 
{ 
    var success:Boolean = fileRefList.browse(new Array(imageFilter, textFilter)); 
} 
catch (error:Error)  
{ 
    trace("Unable to browse for files."); 
}

Att låta användaren välja och överföra en eller flera filer med hjälp av klassen FileReferenceList är detsamma som att använda FileReference.browse() för att välja filer, även om FileReferenceList låter dig välja flera filer. Vid överföring av flera filer måste du överföra varje fil med hjälp av FileReference.upload(), som i följande kod:

var fileRefList:FileReferenceList = new FileReferenceList(); 
fileRefList.addEventListener(Event.SELECT, selectHandler); 
fileRefList.browse(); 
 
function selectHandler(event:Event):void 
{ 
    var request:URLRequest = new URLRequest("http://www.[yourdomain].com/fileUploadScript.cfm"); 
    var file:FileReference; 
    var files:FileReferenceList = FileReferenceList(event.target); 
    var selectedFileArray:Array = files.fileList; 
    for (var i:uint = 0; i < selectedFileArray.length; i++) 
    { 
        file = FileReference(selectedFileArray[i]); 
        file.addEventListener(Event.COMPLETE, completeHandler); 
        try 
        { 
            file.upload(request); 
        } 
        catch (error:Error) 
        { 
            trace("Unable to upload files."); 
        } 
    } 
} 
function completeHandler(event:Event):void 
{ 
    trace("uploaded"); 
}

Eftersom händelsen Event.COMPLETE läggs in i varje enskilt FileReference-objekt i arrayen, anropar Flash Player metoden completeHandler() när varje enskild fil har överförts.