De FileReference-klasse gebruiken

Flash Player 9 of hoger, Adobe AIR 1.0 of hoger

Een FileReference-object vertegenwoordigt een gegevensbestand op een client- of servercomputer. Met de methoden van de klasse FileReference kan uw toepassing gegevensbestanden lokaal laden en opslaan, en bestandsgegevens van en naar externe servers overbrengen.

De klasse FileReference biedt twee verschillende benaderingen om gegevensbestanden te laden, over te brengen en op te slaan. Sinds de introductie van de klasse FileReference bevat deze klasse de methode browse() , de methode upload() en de methode download() . Gebruik de methode browse() om de gebruiker een bestand te laten selecteren. Gebruik de methode upload() om bestandsgegevens naar een externe server over te brengen. Gebruik de methode download() om die gegevens weer van de server op te halen en ze in een lokaal bestand op te slaan. Vanaf Flash Player 10 en Adobe AIR 1.5 bevat de klasse FileReference eveneens de methoden load() en save() . Met de methoden load() en save() hebt u rechtstreeks toegang tot lokale bestanden en kunt u deze eveneens opslaan. U gebruikt deze methoden op dezelfde manier als de gelijknamige methoden in de klassen URLLoader en Loader.

Opmerking: De File-klasse, die de FileReference-klasse bevat, en de FileStream-klasse bieden extra functies voor het werken met bestanden en het lokale bestandssysteem. De File- en FileStream-klassen worden alleen ondersteund in AIR en niet in Flash Player.

Aangeraden door Adobe

Lokale bestanden laden en opslaan

Kevin Hoyt
In deze video laat Kevin Hoyt zien hoe gemakkelijk u lokale inhoud met Flash kunt laden en opslaan.

FileReference, klasse

Elk FileReference-object vertegenwoordigt één gegevensbestand op de lokale machine. De eigenschappen van de FileReference-klasse bevat informatie over de grootte, type, naam, bestandsnaam, bestandsextensie, auteur, aanmaakdatum en aanpassingsdatum van het bestand.

Opmerking: De eigenschap creator wordt alleen in Mac OS ondersteund. Op alle andere platformen wordt null geretourneerd.
Opmerking: De eigenschap extension wordt alleen in Adobe AIR ondersteund.

U kunt op twee manieren een instantie van de klasse FileReference maken:

  • Gebruik de operator new zoals in de volgende code wordt geïllustreerd:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Roep de methode FileReferenceList.browse() op, waarmee een dialoogvenster wordt geopend waarin de gebruiker wordt gevraagd een of meer bestanden te selecteren om te uploaden. Vervolgens wordt een array met FileReference-objecten gemaakt als de gebruiker een of meer bestanden heeft geselecteerd.

Wanneer u een FileReference-object hebt gemaakt, kunt u het volgende doen:

  • Roep de methode FileReference.browse() op, waarmee een dialoogvenster wordt geopend waarin de gebruiker wordt gevraagd één bestand in het lokale bestandssysteem te selecteren. Dit gebeurt gewoonlijk vóór een daaropvolgende aanroep van de methode FileReference.upload() of de methode FileReference.load() . Roep de methode FileReference.upload() aan om het bestand naar een externe server te uploaden. Roep de methode FileReference.load() aan om een lokaal bestand te openen.

  • Roep de methode FileReference.download() aan. De download() -methode opent een dialoogvenster zodat de gebruiker een locatie kan selecteren waar een nieuw bestand wordt opgeslagen. Daarna worden de gegevens van de server gedownload en in het nieuwe bestand opgeslagen.

  • Roep de methode FileReference.load() aan. Deze methode begint gegevens te laden uit een bestand dat eerder is geselecteerd met de methode browse() . De methode load() kan pas worden aangeroepen wanneer de bewerking browse() is voltooid (dus wanneer de gebruiker een bestand heeft geselecteerd).

  • Roep de methode FileReference.save() aan. Deze methode opent een dialoogvenster waarin de gebruiker wordt gevraagd een enkele bestandslocatie op het lokale bestandssysteem te selecteren. Daarna worden de gegevens op de opgegeven locatie opgeslagen.

Opmerking: U kunt maar één browse() -, download() - of save() -actie tegelijk uitvoeren, aangezien er maar één dialoogvenster tegelijk kan zijn geopend.

De eigenschappen van het FileReference-object, zoals name , size en modificationDate , worden pas in een van de volgende omstandigheden gedefinieerd:

  • De methode FileReference.browse() of FileReferenceList.browse() is opgeroepen en de gebruiker heeft een bestand geselecteerd in het dialoogvenster.

  • De methode FileReference.download() is opgeroepen en de gebruiker heeft een nieuwe bestandslocatie in het dialoogvenster opgegeven.

Opmerking: Wanneer een bestand wordt gedownload, wordt alleen de eigenschap FileReference.name met gegevens gevuld voordat de download is voltooid. Nadat het bestand is gedownload, zijn alle andere eigenschappen beschikbaar.

Terwijl oproepen van de methoden FileReference.browse() , FileReferenceList.browse() , FileReference.download() , FileReference.load() of FileReference.save() worden uitgevoerd, gaan de meeste spelers door met het afspelen van SWF-bestanden, waaronder het verzenden van gebeurtenissen en het uitvoeren van code.

Voor het uploaden en downloaden heeft een SWF-bestand alleen toegang tot bestanden binnen het eigen domein, inclusief alle domeinen die door een beleidsbestand zijn opgegeven. U moet een beleidsbestand plaatsen op de server die het bestand bevat als de server zich niet in hetzelfde domein bevindt als het SWF-bestand dat de upload of download heeft gestart.

Zie FileReference .

Gegevens uit bestanden laden

Met de methode FileReference.load() kunt u gegevens uit een lokaal bestand in het geheugen laden.

Opmerking: De code moet eerst de methode FileReference.browse() aanroepen opdat de gebruiker het te laden bestand kan selecteren. Deze beperking is niet van toepassing op inhoud die wordt uitgevoerd in Adobe AIR in de beveiligingssandbox van de toepassing.

De methode FileReference.load() keert onmiddellijk terug nadat deze is aangeroepen, maar de te laden gegevens zijn niet onmiddellijk beschikbaar. Het FileReference-object verzendt gebeurtenissen om listenermethoden te activeren bij elke stap van het laadproces.

Het FileReference-object verzendt tijdens het laadproces de volgende gebeurtenissen.

  • open -gebeurtenis ( Event.OPEN ): Wordt verzonden wanneer de laadbewerking start.

  • progress -gebeurtenis ( ProgressEvent.PROGRESS ): Wordt regelmatig verzonden naarmate gegevensbytes uit het bestand worden gelezen.

  • complete -gebeurtenis ( Event.COMPLETE ): Wordt verzonden wanneer de laadbewerking met succes is voltooid.

  • ioError -gebeurtenis ( IOErrorEvent.IO_ERROR ): Wordt verzonden als het laadproces is mislukt als gevolg van een invoer-/uitvoerfout tijdens het openen of lezen van gegevens uit het bestand.

Zodra het FileReference-object de volledige gebeurtenis heeft verzonden, kunnen de geladen gegevens worden benaderd als een ByteArray in de eigenschap data van het FileReference-object.

In het volgende voorbeeld ziet u hoe de gebruiker wordt gevraagd een bestand te selecteren en hoe de gegevens vervolgens uit dat bestand in het geheugen worden geladen:

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."); 
        } 
    } 
}

In de voorbeeldcode wordt eerst een FileReference-object met de naam fileRef gemaakt, en daarna wordt de methode browse() van dit object aangeroepen. De browse() -methode opent een dialoogvenster die de gebruiker vraagt om een bestand te selecteren. Als een bestand is geselecteerd wordt de methode onFileSelected() door de code aangeroepen. Deze methode voegt listeners voor de gebeurtenissen progress en complete toe en roept vervolgens de methode load() van het FileReference-object aan. De andere handlermethoden in het voorbeeld genereren alleen berichten om te rapporteren over de voortgang van de laadbewerking. Wanneer het laden is voltooid, geeft de toepassing de inhoud van het geladen bestand weer met behulp van de methode trace() .

In Adobe AIR, biedt de FileStream-klasse een aanvullende functionaliteit voor het lezen van gegevens van een lokaal bestand. Zie Lezen van en schrijven naar bestanden .

Gegevens opslaan in lokale bestanden

Met de methode FileReference.save() kunt u gegevens opslaan in een lokaal bestand. Deze methode begint met het openen van een dialoogvenster waarin de gebruiker een nieuwe bestandsnaam en de locatie kan opgeven waar het bestand moet worden opgeslagen. Nadat de gebruiker de bestandsnaam en -locatie heeft geselecteerd, worden de gegevens naar het nieuwe bestand geschreven. Wanneer het bestand is opgeslagen, worden de eigenschappen van het object FileReference gevuld met de eigenschappen van het lokale bestand.

Opmerking: Uw code kan alleen de FileReference.save() -methode aanroepen als reactie op een gebeurtenis die door een gebruiker is gestart, zoals een muisklik of een actie op het toetsenbord. Anders wordt een fout gegenereerd. Deze beperking is niet van toepassing op actieve inhoud in Adobe AIR in de beveiligingssandbox van de toepassing.

De methode FileReference.save() retourneert onmiddellijk na de oproep. Het FileReference-object verzendt vervolgens gebeurtenissen om listenermethoden te activeren bij elke stap van het opslagproces.

Het FileReference-object verzendt de volgende gebeurtenissen tijdens het opslagproces:

  • select -gebeurtenis ( Event.SELECT ): Wordt verzonden wanneer de gebruiker de locatie en bestandsnaam opgeeft voor het nieuwe bestand dat moet worden opgeslagen.

  • cancel -gebeurtenis ( Event.CANCEL ): Wordt verzonden wanneer de gebruiker in het dialoogvenster op Annuleren klikt.

  • open -gebeurtenis ( Event.OPEN ): Wordt verzonden wanneer de opslagbewerking start.

  • progress -gebeurtenis ( ProgressEvent.PROGRESS ): Wordt regelmatig verzonden naarmate gegevensbytes in het bestand worden opgeslagen.

  • complete -gebeurtenis ( Event.COMPLETE ): Wordt verzonden wanneer de opslagbewerking met succes is voltooid.

  • ioError -gebeurtenis ( IOErrorEvent.IO_ERROR ): Wordt verzonden als het opslagproces mislukt als gevolg van een invoer-/uitvoerfout tijdens het opslaan van gegevens in het bestand.

Het type object dat in de parameter data van de methode FileReference.save() wordt doorgegeven, bepaalt hoe de gegevens naar het bestand worden geschreven:

  • Als het een String-waarde is, wordt het bestand opgeslagen als een tekstbestand met UTF-8-codering.

  • Als het een XML-object is, worden de gegevens weggeschreven naar een bestand in de XML-indeling waarbij alle opmaak bewaard blijft.

  • Als het een ByteArray-object is, wordt de inhoud rechtstreeks en zonder conversie naar het bestand geschreven.

  • Als het een ander type object is, roept de methode FileReference.save() de methode toString() van het object aan en wordt de resulterende String-waarde opgeslagen in een UTF-8-tekstbestand. Als de methode toString() van het object niet kan worden aangeroepen, wordt een fout gegenereerd.

Als de parameter data de waarde null heeft, wordt een fout gegenereerd.

De volgende code is een uitbreiding op het vorige voorbeeld van de methode FileReference.load() . Nadat de gegevens uit het bestand zijn gelezen, wordt de gebruiker in het voorbeeld naar een bestandsnaam gevraagd en worden de gegevens in een nieuw bestand opgeslagen:

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."); 
        } 
    } 
}

Wanneer alle gegevens uit het bestand geladen zijn, wordt de methode onComplete() door de code aangeroepen. De methode onComplete() verwijdert de listeners voor de laadgebeurtenissen en roept vervolgens de methode saveFile() op. De methode FileReference.save() wordt door de methode saveFile() aangeroepen. Er wordt door de methode FileReference.save() een nieuw dialoogvenster geopend waarin de gebruiker een nieuwe bestandsnaam en -locatie kan selecteren om het bestand op te slaan. De overige gebeurtenislistenermethoden volgen de voortgang van het opslagproces tot het is voltooid.

In Adobe AIR, biedt de FileStream-klasse extra functionaliteit voor het schrijven van gegevens naar een lokaal bestand. Zie Lezen van en schrijven naar bestanden .

Bestanden uploaden naar een server

Als u bestanden wilt uploaden naar een server, roept u eerst de methode browse() aan, waarmee de gebruiker een of meer bestanden kan selecteren. Wanneer vervolgens de methode FileReference.upload() wordt aangeroepen, wordt het geselecteerde bestand overgebracht naar de server. Als de gebruiker meerdere bestanden selecteert met de methode FileReferenceList.browse() , maakt Flash Player een array met de geselecteerde bestanden, met de naam FileReferenceList.fileList . U kunt vervolgens elk bestand afzonderlijk uploaden met de methode FileReference.upload() .

Opmerking: Met de methode FileReference.browse() kan slechts één bestand worden geüpload. Als u wilt dat de gebruiker meerdere bestanden kan uploaden, moet u de methode FileReferenceList.browse() gebruiken.

In het dialoogvenster met de bestandskiezer van het besturingssysteem kunnen gebruikers standaard elk bestandstype op de lokale computer selecteren. Ontwikkelaars kunnen een of meer aangepaste bestandstypefilters opgeven door de klasse FileFilter te gebruiken en een array met bestandsfilterinstanties door te geven aan de methode 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);

Nadat de gebruiker de bestanden heeft geselecteerd en op de knop Openen in de bestandskiezer heeft geklikt, wordt de gebeurtenis Event.SELECT verzonden. Als de methode FileReference.browse() wordt gebruikt om een bestand voor het uploaden te selecteren, wordt het bestand door de volgende code naar een webserver verzonden:

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"); 
}
U kunt gegevens naar de server verzenden met de methode FileReference.upload() door gebruik te maken van de eigenschappen URLRequest.method en URLRequest.data om variabelen te verzenden met de methode POST of GET .

Wanneer u probeert om een bestand te laden met de FileReference.upload() -methode, worden de volgende gebeurtenissen verzonden:

  • open -gebeurtenis ( Event.OPEN ): Wordt verzonden wanneer de laadbewerking start.

  • progress -gebeurtenis ( ProgressEvent.PROGRESS ): Wordt regelmatig verzonden naarmate gegevensbytes uit het bestand worden geladen.

  • complete -gebeurtenis ( Event.COMPLETE ): Wordt verzonden wanneer de laadbewerking met succes is voltooid.

  • httpStatus -gebeurtenis ( HTTPStatusEvent.HTTP_STATUS ): Wordt verzonden wanneer het laadproces mislukt door een HTTP-fout.

  • httpResponseStatus -gebeurtenis ( HTTPStatusEvent.HTTP_RESPONSE_STATUS ): Wordt verzonden als een aanroep van de methode upload() of uploadUnencoded() via HTTP toegang tot gegevens probeert te krijgen, en Adobe AIR de statuscode voor de aanvraag kan detecteren en retourneren.

  • securityError -gebeurtenis ( SecurityErrorEvent.SECURITY_ERROR Verzonden wanneer een oplaadactie mislukt als gevolg van een schending van de beveiliging.

  • uploadCompleteData -gebeurtenis ( DataEvent.UPLOAD_COMPLETE_DATA ): Wordt verzonden nadat gegevens van de server zijn ontvangen nadat het uploaden is voltooid.

  • ioError -gebeurtenis ( IOErrorEvent.IO_ERROR ): Wordt verzonden als het uploadproces mislukt door een van de volgende oorzaken:

    • Er is een invoer-/uitvoerfout opgetreden terwijl Flash Player het bestand las, schreef of verzond.

    • Het SWF-bestand probeert een bestand te uploaden dat verificatie vereist (zoals een gebruikersnaam en een wachtwoord). Tijdens het uploaden biedt Flash Player gebruikers niet de mogelijkheid een wachtwoord in te voeren.

    • De parameter url bevat een ongeldig protocol. De methode FileReference.upload() moet HTTP of HTTPS gebruiken.

Flash Player biedt geen volledige ondersteuning van servers die verificatie vereisen. Alleen SWF-bestanden die in een browser worden uitgevoerd, waarbij de browserinsteekmodule of het Microsoft ActiveX®-besturingselement wordt gebruikt, kunnen een dialoogvenster weergeven waarin de gebruiker wordt gevraagd een gebruikersnaam en wachtwoord ter verificatie in te voeren. Bovendien is dit alleen mogelijk voor downloads. Bij uploaden met behulp van de insteekmodule of het ActiveX-besturingselement, of bij uploaden/downloaden met een zelfstandige of externe speler, mislukt de bestandsoverdracht.

Als u in ColdFusion een serverscript maakt dat een bestandsupload van Flash Player accepteert, kunt u code gebruiken zoals hier beschreven:

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

Deze ColdFusion-code uploadt het bestand dat door Flash Player is verzonden en slaat het op in dezelfde map als de ColdFusion-sjabloon. Als er een bestand met dezelfde naam aanwezig is, wordt dit overschreven. De voorgaande code bevat de minimale code die nodig is om een bestandsupload te accepteren. Dit script moet niet worden gebruikt in een productie-omgeving. U kunt het beste gegevensvalidatie toevoegen zodat gebruikers alleen geaccepteerde bestandstypen kunnen uploaden, zoals een afbeelding in plaats van een potentieel gevaarlijk serverscript.

De volgende code bevat een voorbeeld van een bestandsupload met PHP en bevat gegevensvalidatie. Het script beperkt het aantal geüploade bestanden in de uploadmap tot 10, controleert of het bestand kleiner is dan 200 kB en staat alleen toe dat JPEG-, GIF- of PNG-bestanden worden geüpload naar en opgeslagen op het bestandssysteem.

<?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; 
    } 
} 
?>

U kunt aanvullende variabelen doorgeven aan het uploadscript met de aanvraagmethode POST of GET . Als u aanvullende POST -variabelen naar het uploadscript wilt verzenden, kunt u de volgende code gebruiken:

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"); 
}

In het voorgaande voorbeeld wordt een URLVariables-object gemaakt dat u doorgeeft aan het externe serverscript. In vorige versies van ActionScript kon u variabelen doorgeven aan het serveruploadscript door waarden door te geven in de queryreeks. In ActionScript 3.0 kunt u variabelen aan het externe script doorgeven met een object URLRequest, zodat u gegevens kunt doorgeven met de methode POST of GET . Hiermee kunnen grotere hoeveelheden gegevens gemakkelijker worden doorgegeven. Als u wilt opgeven of de variabelen worden doorgegeven met de aanvraagmethode GET of POST , stelt u de eigenschap URLRequest.method in op respectievelijk URLRequestMethod.GET of URLRequestMethod.POST .

In ActionScript 3.0 kunt u de standaardveldnaam voor uploadbestanden Filedata overschrijven door een tweede parameter door te geven aan de methode upload() , zoals in het volgende voorbeeld wordt getoond (waarin de standaardwaarde Filedata wordt vervangen door Custom1 ).

De Flash Player probeert standaard geen testupload te verzenden, hoewel u deze standaard kan negeren door een waarde van true te passeren als de derde parameter van de upload() -methode. Het doel van de testupload is te controleren of de daadwerkelijke bestandsupload en de serververificatie, indien vereist, zal slagen.

Opmerking: Momenteel vindt een testupload alleen plaats in Flash Player voor Windows.

Het serverscript dat de bestandsupload afhandelt, moet een HTTP POST -aanvraag verwachten met de volgende elementen:

  • Content-Type met de waarde multipart/form-data.

  • Content-Disposition waarbij het kenmerk name is ingesteld op " Filedata " en het kenmerk filename is ingesteld op de naam van het oorspronkelijke bestand U kunt een aangepast kenmerk name opgeven door een waarde voor de parameter uploadDataFieldName door te geven in de methode FileReference.upload() .

  • De binaire inhoud van het bestand.

Hier volgt een voorbeeld van een HTTP POST -aanvraag:

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,,,)

Met het volgende voorbeeld van een HTTP POST -aanvraag worden drie POST -variabelen verzonden: api_sig , api_key en auth_token , en wordt de aangepaste veldnaamwaarde voor uploadgegevens "foto" gebruikt:

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--

Bestanden downloaden vanaf een server

U kunt gebruikers bestanden laten downloaden vanaf een server met behulp van de methode FileReference.download() , die twee parameters gebruikt: request en defaultFileName . De eerste parameter is het object URLRequest dat de URL van het te downloaden bestand bevat. De tweede parameter is optioneel. Hiermee kunt u een standaardbestandsnaam opgeven die wordt weergegeven in het downloaddialoogvenster. Als u de tweede parameter weglaat, wordt defaultFileName gebruikt. Dit is de bestandsnaam uit de opgegeven URL.

Door de volgende code wordt een bestand met de naam index.xml gedownload uit dezelfde map als het SWF-document:

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

Als u de standaardnaam wilt instellen op currentnews.xml in plaats van index.xml, geeft u de parameter defaultFileName op, zoals in het volgende codefragment:

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

De naam van een bestand wijzigen kan nuttig zijn als de bestandsnaam op de server niet intuïtief is of door de server is gegenereerd. Het is ook raadzaam de parameter defaultFileName expliciet op te geven wanneer u een bestand downloadt met een serverscript in plaats van het bestand rechtstreeks te downloaden. U moet de parameter defaultFileName bijvoorbeeld opgeven als u een serverscript gebruikt dat specifieke bestanden downloadt op basis van doorgegeven URL-variabelen. Doet u dat niet, dan is de standaardnaam van het gedownloade bestand de naam van het serverscript.

U kunt gegevens naar de server verzenden met de methode download() door parameters aan de URL toe te voegen die het serverscript kan parseren. Het volgende ActionScript 3.0-fragment downloadt een document op basis waarvan parameters worden doorgegeven aan een ColdFusion-script:

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."); 
            } 
        } 
    } 
}

In de volgende code ziet u het ColdFusion-script, download.cfm, dat een van twee bestanden downloadt van de server, afhankelijk van de waarde van een URL-variabele:

<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>

FileReferenceList, klasse

Met de klasse FileReferenceList kan de gebruiker een of meer bestanden selecteren die naar een serverscript worden geüpload. De bestandsupload wordt afgehandeld door de methode FileReference.upload() , die moet worden aangeroepen voor elk bestand dat de gebruiker selecteert.

De volgende code maakt twee objecten FileFilter ( imageFilter en textFilter ) en geeft ze in een array door aan de methode FileReferenceList.browse() . Dit zorgt ervoor dat het bestandsdialoogvenster van het besturingssysteem twee mogelijke filters voor bestandstypen weergeeft.

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."); 
}

Als u wilt dat de gebruiker een of meer bestanden kan selecteren en uploaden met de klasse FileReferenceList, staat dat gelijk aan het gebruik van FileReference.browse() voor het selecteren van bestanden. Met FileReferenceList kunnen echter meerdere bestanden worden geselecteerd. Voor het uploaden van meerdere bestanden moet u elk van de geselecteerde bestanden uploaden met behulp van FileReference.upload() , zoals in de volgende code:

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"); 
}

Aangezien de gebeurtenis Event.COMPLETE wordt toegevoegd aan elk afzonderlijk FileReference-object in de array, roept Flash Player de methode completeHandler() aan nadat elk afzonderlijk bestand is geüpload.