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