Korzystanie z klasy FileReference

Flash Player 9 i nowsze wersje, Adobe AIR 1.0 i nowsze wersje

Obiekt FileReference reprezentuje plik danych na komputerze klienckim lub serwerze. Metoda klasy FileReference umożliwia aplikacji ładowanie i zapisywanie plików danych lokalnie, a także przesyłanie plików danych do serwerów zdalnych oraz z tych serwerów.

Klasa FileReference oferuje dwa różne podejścia do ładowania, przesyłania i zapisywania plików danych. Klasa FileReference już w pierwotnej wersji zawierała metody browse() , upload() oraz download() . Metoda browse() umożliwia użytkownikowi wybranie pliku. Metoda upload() służy do przesyłania plików danych na serwer zdalny. Metoda download() służy do pobierania tych danych z serwera i zapisywania ich w pliku lokalnym. Począwszy od wersji Flash Player 10 i Adobe AIR 1.5 klasa FileReference zawiera metody load() i save() . Metody load() i save() umożliwiają odczytywanie i zapisywanie również plików lokalnych. Z metod tych korzysta się podobnie, jak z analogicznych metod klas URLLoader i Loader.

Uwaga: Klasa File, która rozszerza klasę FileReference, oraz klasa FileStream, udostępniają dodatkowe funkcje przydatne w operowaniu na plikach i lokalnym systemie plików. Klasy File i FileStream są obsługiwane tylko w środowisku AIR, a nie w programie Flash Player.

Firma Adobe poleca

Wczytywanie i zapisywanie plików lokalnych

Kevin Hoyt
W tym materiale wideo Kevin Hoyt pokazuje, jak proste jest wczytywanie i zapisywanie zawartości lokalnej przy użyciu programu Flash.

FileReference, klasa

Każdy obiekt FileReference przedstawia pojedynczy plik danych na komputerze lokalnym. Właściwości klasy FileReference zawierają informacje dotyczące wielkości, typu, nazwy, rozszerzenia, autora, daty utworzenia i daty modyfikacji pliku.

Uwaga: Właściwość creator jest obsługiwana tylko w systemie Mac OS. Wszystkie pozostałe platformy zwracają wartość null .
Uwaga: Właściwość extension jest obsługiwana tylko w środowisku wykonawczym Adobe AIR.

Instancję klasy FileReference można utworzyć na dwa sposoby:

  • Za pomocą operatora new , co przedstawiono w kodzie poniżej:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Wywołaj metodę FileReferenceList.browse() , co spowoduje otwarcie okna dialogowego i wyświetlenie monitu dotyczącego wyboru jednego lub większej liczby plików do załadowania. Następnie metoda utworzy tablicę obiektów FileReference, gdy użytkownik pomyślnie wybierze jeden lub większą liczbę plików.

Po utworzeniu obiektu FileReference można wykonać następujące czynności:

  • Wywołaj metodę FileReference.browse() , co spowoduje otwarcie okna dialogowego i wyświetlenie monitu dotyczącego wyboru jednego pliku z lokalnego systemu plików. Czynność tę zwykle wykonuje się przed wywołaniem metody FileReference.upload() lub FileReference.load() . Aby przesłać plik na serwer zdalny, należy wywołać metodę FileReference.upload() . Aby otworzyć plik lokalny, należy wywołać metodę FileReference.load() .

  • Wywołaj metodę FileReference.download() . Metoda download spowoduje otwarcie okna dialogowego, w którym użytkownik będzie mógł wybrać lokalizację dla zapisu nowego pliku. Następnie metoda pobierze dane z serwera i zapisze je w nowym pliku.

  • Wywołaj metodę FileReference.load() . Ta metoda rozpoczyna ładowanie danych z pliku wybranego wcześniej za pomocą metody browse() . Metodę load() można wywołać dopiero po zakończeniu operacji browse() (tzn. gdy użytkownik wybierze plik).

  • Wywołaj metodę FileReference.save() . Ta metoda otwiera okno dialogowe i monituje użytkownika o wybranie jednego położenia pliku w lokalnym systemie plików. Następnie zapisuje dane w określonym położeniu.

Uwaga: Jednocześnie można wykonywać jedną operację browse() , download() lub save() , ponieważ w danej chwili może być otwarte tylko jedno okno dialogowe.

Wartości właściwości obiektu FileReference, takich jak name , size i modificationDate , nie są zdefiniowane do czasu wystąpienia jednej z poniższych sytuacji:

  • Wywołana została metoda FileReference.browse() lub metoda FileReferenceList.browse() , a użytkownik wybrał plik za pomocą okna dialogowego.

  • Została wywołana metoda FileReference.download() , a użytkownik wybrał lokalizację dla nowego pliku za pomocą okna dialogowego.

Uwaga: Przed zakończeniem pobierania wartość jest wprowadzana tylko do właściwości FileReference.name . Po pobraniu pliku dostępne są wszystkie właściwości.

W trakcie wykonywania wywołań do metod FileReference.browse() , FileReferenceList.browse() , FileReference.download() , FileReference.load() lub FileReference.save() większość odtwarzaczy kontynuuje odtwarzanie pliku SWF, w tym wywoływanie zdarzeń i wykonywanie kodu.

W operacjach wysyłania i pobierania plik SWF może uzyskiwać dostęp do plików tylko we własnej domenie, łącznie z dowolnymi domenami określonymi przez plik strategii. Jeśli serwer zawierający plik nie należy do tej samej domeny, co plik SWF inicjujący wysyłanie lub pobieranie, plik strategii musi być umieszczony na serwerze.

Patrz FileReference .

Ładowanie danych z plików

Metoda FileReference.load() umożliwia ładowanie danych z pliku lokalnego do pamięci.

Uwaga: Kod musi najpierw wywoływać metodę FileReference.browse() , aby umożliwić użytkownikowi wybranie pliku do załadowania. To ograniczenie nie ma zastosowania do treści działającej w środowisku Adobe AIR wewnątrz obszaru izolowanego aplikacji.

Powrót z metody FileReference.load() następuje natychmiast po wywołaniu, ale ładowane dane nie są od razu dostępne. Obiekt FileReference wywołuje zdarzenia w celu wywołania metod detektora na każdym kroku procesu ładowania.

Obiekt FileReference wywołuje następujące zdarzenia podczas procesu ładowania.

  • Zdarzenie open ( Event.OPEN ): wywoływane z chwilą rozpoczęcia operacji ładowania.

  • Zdarzenie progress ( ProgressEvent.PROGRESS ): wywoływane okresowo w miarę odczytywania bajtów danych z pliku.

  • Zdarzenie complete ( Event.COMPLETE ): wywoływane, gdy operacja ładowania zakończy się pomyślnie.

  • Zdarzenie ioError ( IOErrorEvent.IO_ERROR ): wywoływane w przypadku niepowodzenia procesu ładowania z powodu błędu wejścia/wyjścia podczas otwierania pliku lub odczytu danych z pliku.

Gdy obiekt FileReference wywoła zdarzenie complete, można uzyskiwać dostęp do danych jako do obiektu ByteArray we właściwości data obiektu FileReference.

Poniższy przykład prezentuje sposób monitowania użytkownika w celu wybrania pliku, a także załadowania danych z pliku do pamięci:

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

Przykładowy kod najpierw tworzy obiekt FileReference o nazwie fileRef , a następnie wywołuje jego metodę browse() . Metoda browse powoduje otwarcie okna dialogowego, w którym wyświetlany jest monit o wybranie pliku. Po wybraniu pliku kod wywołuje metodę onFileSelected() . Metoda ta dodaje detektory zdarzeń progress i complete , a następnie wywołuje metodę load() obiektu FileReference. Inne metody modułu obsługi w tym przykładzie wyświetlają komunikaty informujące o postępie operacji ładowania. Po zakończeniu ładowania aplikacja wyświetla treść załadowanego pliku, korzystając z metody trace() .

W środowisku Adobe AIR klasa FileStream udostępnia dodatkową funkcjonalność związaną z odczytem danych z pliku lokalnego. Patrz Odczyt i zapis plików .

Zapisywanie danych w plikach lokalnych

Metoda FileReference.save() umożliwia zapisanie danych w pliku lokalnym. Jest uruchamiana poprzez otwarcie okna dialogowego, w którym użytkownik może wprowadzić nową nazwę pliku oraz lokalizację, do której plik zostanie zapisany. Gdy użytkownik wybierze nazwę i lokalizację pliku, następuje zapisanie danych w nowym pliku. Jeśli zapisywanie pliku zakończy się pomyślnie, właściwości obiektu FileReference są wypełniane właściwościami pliku lokalnego.

Uwaga: Kod powinien wywoływać metodę FileReference.save() tylko w odpowiedzi na zdarzenie wywołane przez użytkownika, takie jak kliknięcie lub naciśnięcie klawisza na klawiaturze. W przeciwnym razie zostanie zgłoszony błąd. To ograniczenie nie ma zastosowania do treści działającej w środowisku Adobe AIR wewnątrz obszaru izolowanego aplikacji.

Powrót z metody FileReference.save() następuje natychmiast po wywołaniu. Następnie obiekt FileReference wywołuje zdarzenia w celu wywołania metod detektora na każdym kroku procesu zapisywania pliku.

Obiekt FileReference wywołuje następujące zdarzenia podczas procesu zapisywania pliku:

  • Zdarzenie select ( Event.SELECT ): wywoływane, gdy użytkownik określi lokalizację i nazwę dla nowego zapisywanego pliku.

  • Zdarzenie cancel ( Event.CANCEL ): wywoływane, gdy użytkownik kliknie przycisk Anuluj w oknie dialogowym.

  • Zdarzenie open ( Event.OPEN ): wywoływane z chwilą rozpoczęcia operacji zapisywania.

  • Zdarzenie progress ( ProgressEvent.PROGRESS ): wywoływane okresowo w miarę zapisywania bajtów danych w pliku.

  • Zdarzenie complete ( Event.COMPLETE ): wywoływane, gdy operacja zapisywania zakończy się pomyślnie.

  • Zdarzenie ioError ( IOErrorEvent.IO_ERROR ): wywoływane w przypadku niepowodzenia procesu zapisywania z powodu błędu wejścia/wyjścia podczas próby zapisania danych w pliku.

Typ obiektu przekazany w parametrze data metody FileReference.save() określa sposób zapisywania danych do pliku:

  • Jeśli jest to wartość String, wówczas zostanie zapisana jako plik tekstowy z kodowaniem UTF-8.

  • Jeśli jest to obiekt XML, wówczas zostanie zapisany w pliku formatu XML z zachowaniem całego formatowania.

  • Jeśli jest to obiekt ByteArray, wówczas jego treść zostanie zapisana bezpośrednio do pliku bez konwersji.

  • Jeśli jest to obiekt innego typu, wówczas metoda FileReference.save() wywoła metodę toString() dla obiektu i zapisze wynikową wartość String w pliku tekstowym UTF-8. Jeśli nie można wywołać metody toString() obiektu, zostanie zgłoszony błąd.

Jeśli wartość parametru data jest równa null , zostanie zgłoszony błąd.

Poniższy kod uzupełnia poprzedni przykład użycia metody FileReference.load() . Po odczytaniu danych z pliku kod powoduje wyświetlenie monitu dotyczącego określenia nazwy pliku, a następnie zapisuje dane w nowym pliku:

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

Po załadowaniu danych z pliku wywoływana jest metoda onComplete() . Metoda onComplete() usuwa detektory ze zdarzeń ładowania, a następnie wywołuje metodę saveFile() . Metoda saveFile() wywołuje metodę FileReference.save() . Metoda FileReference.save() otwiera nowe okno dialogowe, aby umożliwić użytkownikowi wprowadzenie nazwy nowego pliku i lokalizacji zapisu tego pliku. Pozostałe metody detektora zdarzeń śledzą postęp procesu zapisywania pliku do czasu zakończenia tego procesu.

W środowisku Adobe AIR klasa FileStream udostępnia dodatkową funkcjonalność związaną zapisem danych w pliku lokalnym. Zobacz Odczyt i zapis plików .

Wysyłanie plików do serwera

W celu wysłania plików na serwer najpierw należy wywołać metodę browse() , aby umożliwić użytkownikowi wybranie jednego lub większej liczby plików. Następnie po wywołaniu metody FileReference.upload() wybrany plik zostanie przesłany na serwer. Jeśli użytkownik wybrał wiele plików za pomocą metody FileReferenceList.browse() , program Flash Player utworzy tablicę wybranych plików o nazwie FileReferenceList.fileList . Następnie można użyć metody FileReference.upload() w celu wysłania każdego pliku osobno.

Uwaga: Użycie metody FileReference.browse() umożliwia wysyłanie tylko pojedynczych plików. Aby umożliwić użytkownikowi wysłanie wielu plików, należy zastosować metodę FileReferenceList.browse() .

Domyślnie w systemowym opnie dialogowym wyboru plików można wybrać plik dowolnego typu z komputera lokalnego. Programiści mogą wybrać jeden lub większą liczbę filtrów niestandardowych typów plików — w tym celu należy skorzystać z klasy FileFilter i przekazać tablicę instancji filtrów plików do metody 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);

Jeśli użytkownik wybrał pliki i kliknąć przycisk Otwórz w systemowym obszarze wybierania plików, następuje wywołanie zdarzenia Event.SELECT . Jeśli do wybrania pliku przeznaczonego do wysłania użyto metody FileReference.browse() , poniższy kod powoduje wysłanie pliku na serwer sieci Web:

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"); 
}
Dane można wysłać na serwer za pomocą metody FileReference.upload() poprzez wykorzystanie właściwości URLRequest.method i URLRequest.data w celu wysłania zmiennych za pomocą metod POST i GET .

Po wykonaniu próby wysłania pliku za pomocą metody FileReference.upload() zostaną wywołane następujące zdarzenia:

  • Zdarzenie open ( Event.OPEN ): wywoływane z chwilą rozpoczęcia operacji wysyłania.

  • Zdarzenie progress ( ProgressEvent.PROGRESS ): wywoływane okresowo w miarę wysyłania bajtów danych z pliku.

  • Zdarzenie complete ( Event.COMPLETE ): wywoływane, gdy operacja wysyłania zakończy się pomyślnie.

  • Zdarzenie httpStatus ( HTTPStatusEvent.HTTP_STATUS ): wywoływane w razie niepowodzenia wysyłania spowodowanego błędem HTTP.

  • Zdarzenie httpResponseStatus ( HTTPStatusEvent.HTTP_RESPONSE_STATUS ): wywoływane, jeśli wywołanie metody upload() lub uploadUnencoded() skutkuje próbą uzyskania dostępu do danych za pomocą protokołu HTTP i środowisko Adobe AIR ma możliwość wykrycia i zwrócenia kodu stanu dla żądania.

  • Zdarzenie securityError ( SecurityErrorEvent.SECURITY_ERROR ): wywoływane w razie niepowodzenia wysyłania spowodowanego naruszeniem zabezpieczeń.

  • Zdarzenie uploadCompleteData ( DataEvent.UPLOAD_COMPLETE_DATA ): wywoływane po pomyślnym wysłaniu danych i odebraniu danych z serwera.

  • Zdarzenie ioError ( IOErrorEvent.IO_ERROR ): wywoływane w razie niepowodzenia procesu wysyłania spowodowanego jedną z poniższych przyczyn:

    • Pojawił się błąd wejścia/wyjścia podczas odczytu, zapisu lub przesyłania pliku przez program Flash Player.

    • Plik SWF podejmuje próbę wysłania pliku na serwer, który wymaga uwierzytelniania (tj. nazwy użytkownika i hasła). Podczas wysyłania program Flash Player nie umożliwia użytkownikowi wprowadzenia haseł.

    • Parametr url zawiera niepoprawny protokół. Metoda FileReference.upload() musi korzystać z protokołu HTTP lub HTTPS.

Program Flash Player nie oferuje pełnej obsługi dla serwerów, które wymagają uwierzytelniania. Tylko pliki SWF, które działają w przeglądarce korzystającej z wtyczki przeglądarki lub formantu Microsoft ActiveX®, mogą udostępniać zachętę dla użytkownika do wprowadzenia nazwy i hasła użytkownika w celu uwierzytelnienia, a następnie dla operacji pobierania. W przypadku wysyłania za pomocą wtyczki lub formantu ActiveX lub w przypadku pobierania/wysyłania za pomocą samodzielnego lub zewnętrznego odtwarzacza, przesyłanie pliku zakończy się niepowodzeniem.

Aby utworzyć skrypt serwera w programie ColdFusion w celu zaakceptowania wysyłania pliku z programu Flash Player, można użyć kodu podobnego do poniższego:

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

Ten kod ColdFusion wysyła plik wysłany przez program Flash Player i zapisuje go w tym samym katalogu, co szablon ColdFusion, zastępując wszelkie pliki o tej nazwie. Poprzedni przykład przedstawia minimalny kod wymagany do akceptacji wysyłania pliku; ten skrypt nie powinien być używany w środowisku produkcyjnym. W idealnym przypadku skrypt powinien także zawierać mechanizmy sprawdzania poprawności danych w celu zapewnienia, że użytkownicy wysyłają tylko zaakceptowane typy plików, takie jak obrazy, a nie potencjalnie niebezpieczne skrypty serwerowe.

Poniższy kod demonstruje wysyłanie plików za pomocą PHP i zawiera również mechanizm sprawdzania poprawności danych. Skrypt ogranicza liczbę plików wysyłanych z katalogu upload do 10, ogranicza wielkość pliku do 200 kB i zezwala na wysyłanie i zapisywanie w systemie plików tylko plików JPEG, GIF lub PNG.

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

Do skryptu wysyłania można wprowadzić dodatkowe zmienne, korzystając z metody żądania POST lub GET . W celu wprowadzenia dodatkowych zmiennych POST do skryptu wysyłania należy użyć poniższego kodu:

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

Poprzedni przykład tworzy obiekt URLVariables, który jest przekazywany do zdalnego skryptu serwerowego. W poprzednich wersjach języka ActionScript możliwe było przekazywanie zmiennych do skryptu wysyłania na serwer poprzez przekazywanie ich w ciągu znaków zapytania. Język ActionScript 3.0 umożliwia przekazywanie zmiennych do skryptu zdalnego za pomocą obiektu URLRequest, który umożliwia wprowadzanie danych za pomocą metody POST lub GET ; to z kolei ułatwia wprowadzanie większych zestawów danych. W celu określenia, czy zmienne są przekazywane za pomocą metody żądania GET lub POST należy ustawić dla właściwości URLRequest.method wartość URLRequestMethod.GET lub URLRequestMethod.POST .

Program ActionScript 3.0 umożliwia również zastąpienie domyślnej nazwy pola wysyłania Filedata poprzez udostępnienie drugiego parametru do metody upload() , co przedstawiono w poprzednim przykładzie (w którym zastąpiono wartość domyślną Filedata wartością Custom1 ).

Domyślnie program Flash Player nie podejmie prób testowania wysyłania, ale to ustawienie można zmienić poprzez wprowadzenie wartości true jako trzeciego parametru metody upload() . Operacja testowania wysyłania sprawdza, czy rzeczywiste wysyłanie pliku i uwierzytelnianie serwera, jeśli wymagane, zakończy się pomyślnie.

Uwaga: Testowanie wysyłania działa aktualnie tylko w programach Flash Players działających w systemach Windows.

Skrypt serwera obsługujący wysyłanie powinien oczekiwać żądania HTTP POST wraz z następującymi elementami:

  • Content-Type z wartością multipart/form-data.

  • Content-Disposition z atrybutem name o wartości „ Filedata ” i atrybutem filename ustawionym na nazwę pliku oryginalnego. Istnieje możliwość określenia niestandardowego atrybutu name — w tym celu należy wprowadzić wartość z parametru uploadDataFieldName do metody FileReference.upload() .

  • Binarne treści pliku.

Poniżej przedstawiono przykładowe żądanie HTTP POST :

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

Poniższe przykładowe żądanie HTTP POST wysyła trzy zmienne POST : api_sig , api_key oraz auth_token , oraz korzysta z niestandardowego pola wysyłania danych o nazwie "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--

Pobieranie plików z serwera

Programista może zezwolić użytkownikom na pobieranie plików z serwera za pomocą metody FileReference.download() , która przyjmuje dwa parametry: request i defaultFileName . Pierwszym parametrem jest obiekt URLRequest, który zawiera adres URL pliku do pobrania. Drugi parametr jest opcjonalny — umożliwia określenie domyślnej nazwy pliku, jaki pojawi się w oknie dialogowym pobierania. Jeśli drugi parametr zostanie pominięty defaultFileName , zostanie użyta nazwa pliku z określonego adresu URL.

Poniższy kod pobiera plik o nazwie index.xml z tego samego katalogu, w którym znajduje się plik SWF:

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

Aby ustawić domyślną nazwę currentnews.xml zamiast nazwy index.xml, należy określić parametr defaultFileName w sposób przedstawiony w poniższym urywku:

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

Zmiana nazwy pliku może być celowa, jeśli nazwa pliku serwera nie była łatwa do zapamiętania lub została wygenerowana przez serwer. Dobrą praktyką podczas pobierania pliku za pomocą skryptu serwerowego — zamiast pobierania pliku bezpośrednio — jest jawne określenie parametru defaultFileName . Na przykład: określenie parametru defaultFileName jest wymagane wówczas, gdy istnieje skrypt serwerowy, który pobiera określone pliki na podstawie zmiennych URL wprowadzonych do tego skryptu. W przeciwnym wypadku domyślna nazwa pobranego pliku będzie nazwą skryptu serwerowego.

Dane mogą być wysyłane na serwer za pomocą metody download() poprzez dołączanie parametrów do adresu URL, który będzie analizowany przez skrypt serwera. Poniższy fragment kodu ActionScript 3.0 pobiera dokument na podstawie parametrów przekazanych do skryptu ColdFusion:

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

Poniższy kod demonstruje skrypt ColdFusion download.cfm, który pobiera jeden lub dwa pliki z serwera URL, w zależności od wartości zmiennej URL:

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

Klasa FileReferenceList umożliwia użytkownikowi wybieranie jednego lub większej liczby plików do wysłania do skryptu serwerowego. Wysyłanie pliku jest obsługiwane przez metodę FileReference.upload() , która musi zostać wywołana przy każdym pliku wybranym przez użytkownika.

Poniższy kod tworzy dwa obiektu FileFilter ( imageFilter i textFilter ), a następnie przekazuje je w tablicy do metody FileReferenceList.browse() . To powoduje, że w oknie dialogowym wyboru plików w systemie operacyjnym następuje wyświetlenie dwóch możliwych filtrów dla typów plików.

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

Zezwolenie użytkownikowi na wybieranie i wysyłanie jednego lub większej liczby plików za pomocą klasy FileReferenceList jest równoważne użyciu metody FileReference.browse() w celu wyboru plików, mimo że klasa FileReferenceList umożliwia wybranie więcej niż jednego pliku. W przypadku wysyłania wielu plików wymagane jest wysłanie każdego z wybranych plików za pomocą metody FileReference.upload() , jak w poniższym kodzie:

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

Zdarzenie Event.COMPLETE jest dodawane do każdego obiektu FileReference w tablicy i dlatego program Flash Player wywołuje metodę completeHandler() po zakończeniu wysyłania każdego pliku.