Uso della classe FileReferenceFlash Player 9 e versioni successive, Adobe AIR 1.0 e versioni successive Un oggetto FileReference rappresenta un file di dati in un computer client o server. I metodi della classe FileReference consentono all'applicazione di caricare e salvare file di dati localmente e trasferirli da e verso server remoti. La classe FileReference offre due diversi approcci al caricamento, al trasferimento e al salvataggio di file di dati. Fin dalla sua introduzione, la classe FileReference ha incluso i metodi browse(), upload() e download(). Utilizzate il metodo browse() per consentire la selezione di un file. Utilizzate il metodo upload() per trasferire i dati del file in un server remoto. Utilizzate il metodo download() per recuperare i dati dal server e salvarli in un file locale. A partire da Flash Player 10 e Adobe AIR 1.5, la classe FileReference include in metodi load() e save()che consentono di accedere e salvare direttamente file locali. L'uso di questi metodi è analogo a quello dei metodi con nomi equivalenti delle classi URLLoader e Loader. Nota: la classe File, che estende la classe FileReference, e la classe FileStream forniscono funzioni aggiuntive per l'utilizzo di file e del file system locale. Le classi File e FileStream sono supportate solo in AIR e non in Flash Player.
Classe FileReferenceOgni oggetto FileReference fa riferimento a un file di dati unico nel computer locale. Le proprietà della classe FileReference contengono informazioni sulla dimensione, il tipo, il nome, l'estensione, l'autore, la data di creazione e la data di modifica del file. Nota: la proprietà creator è supportata solo in Mac OS. Tutte le altre piattaforme restituiscono null.
Nota: la proprietà extension è supportata solo in Adobe AIR.
Potete creare un'istanza della classe FileReference in due modi:
Dopo aver creato un oggetto FileReference, potete:
Nota: potete eseguire una sola azione browse(), download() o save() alla volta, in quanto è possibile aprire una sola finestra di dialogo per volta.
Le proprietà dell'oggetto FileReference, ad esempio name, size o modificationDate, non vengono definite fino a quando non si verifica uno degli eventi seguenti:
Nota: quando si esegue uno scaricamento, viene compilata solo la proprietà FileReference.name prima che l'operazione sia stata completata. Dopo lo scaricamento del file, saranno disponibili tutte le proprietà.
Durante l'esecuzione delle chiamate ai metodi FileReference.browse(), FileReferenceList.browse(), FileReference.download(), FileReference.load() o FileReference.save(), nella maggior parte dei lettori la riproduzione del file SWF, inclusi l'invio di eventi e l'esecuzione di codice, non viene interrotta. Per le operazioni di caricamento e scaricamento, un file SWF può accedere ai file solo all'interno del proprio dominio, compresi gli eventuali domini specificati da un file dei criteri. Se il server che contiene il file non si trova nello stesso dominio del file SWF che inizia il caricamento o lo scaricamento, dovete inserire un file di criteri nel server. Vedete FileReference. Caricamento di dati da fileIl metodo FileReference.load() consente di caricare dati da un file locale in memoria. Nota: il codice deve chiamare in primo luogo il metodo FileReference.browse() per consentire all'utente di selezionare un file da caricare. Questa limitazione non si applica al contenuto in esecuzione in Adobe AIR nella sandbox di sicurezza dell'applicazione.
Il metodo FileReference.load() restituisce un risultato immediatamente dopo essere stato chiamato, ma i dati da caricare non sono disponibili subito. L'oggetto FileReference invia eventi per richiamare metodi listener in ogni fase del processo di caricamento. L'oggetto FileReference invia gli eventi seguenti durante il processo di caricamento.
Quando l'oggetto FileReference ha inviato l'evento di completamento, è possibile accedere ai dati caricati come ByteArray nella proprietà data dell'oggetto FileReference. L'esempio seguente mostra come chiedere all'utente di selezionare un file e quindi caricare i dati del file in memoria: 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.");
}
}
}
Il codice di esempio crea in primo luogo l'oggetto FileReference denominato fileRef e quindi ne chiama il metodo browse(). Questa operazione apre una finestra di dialogo che chiede all'utente di selezionare un file. Quando si seleziona un file, il codice invoca il metodo onFileSelected(). Questo metodo aggiunge listener per gli eventi progress e complete e quindi chiama il metodo load() dell'oggetto FileReference. Gli altri metodi del gestore nell'esempio eseguono semplicemente l'output di messaggi per segnalare l'avanzamento dell'operazione di caricamento. Al termine dell'operazione di caricamento, nell'applicazione viene visualizzato il contenuto del file caricato mediante il metodo trace(). In Adobe AIR, la classe FileStream fornisce funzionalità aggiuntive per la lettura di dati da un file locale. Vedete Lettura e scrittura di file. Salvataggio di dati in file localiIl metodo FileReference.save() consente di salvare dati in un file locale. Apre in primo luogo una finestra di dialogo per consentire all'utente di inserire un nuovo nome di file e un percorso in cui salvare un file. Quando l'utente ha selezionato il nome e il percorso del file, i dati vengono scritti nel nuovo file. Una volta salvato correttamente il file, le proprietà dell'oggetto FileReference vengono compilate con le proprietà del file locale. Nota: il codice deve chiamare il metodo FileReference.save() solo in risposta a un evento utente, ad esempio un gestore di eventi per un clic del mouse o un evento di pressione di un tasto della tastiera. In caso contrario, viene generato un errore. Questa limitazione non si applica al contenuto in esecuzione in Adobe AIR nella sandbox di sicurezza dell'applicazione.
Il metodo FileReference.save() restituisce un risultato subito dopo essere stato chiamato. L'oggetto FileReference invia quindi eventi per chiamare metodi listener in ogni fase del processo di salvataggio. L'oggetto FileReference invia gli eventi seguenti durante il processo di salvataggio del file:
Il tipo di oggetto passato nel parametro data del metodo FileReference.save() determina in che modo i dati vengono scritti nel file:
Se il valore del parametro data è null, viene generato un errore. Il codice seguente estende l'esempio precedente per il metodo FileReference.load(). Dopo aver letto i dati dal file, questo esempio chiede all'utente un nome di file e quindi salva i dati in un nuovo file: 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.");
}
}
}
Quando tutti i dati del file sono stati caricati, il codice chiama il metodo onComplete(). Il metodo onComplete() rimuove i listener per gli eventi di caricamento e quindi chiama il metodo saveFile(). Il metodo saveFile() chiama il metodo FileReference.save(). Il metodo FileReference.save() apre una nuova finestra di dialogo per consentire all'utente di inserire un nuovo nome di file e un percorso per il salvataggio del file. I metodi dei listener di eventi rimanenti tracciano l'avanzamento del processo di salvataggio del file fino al suo completamento. In Adobe AIR, la classe FileStream fornisce funzionalità aggiuntive per la scrittura di dati da un file locale. Vedete Lettura e scrittura di file. Caricamento di file su un serverPer caricare dei file su un server, chiamate innanzi tutto il metodo browse() per consentire all'utente di selezionare uno o più file. Quindi, in seguito alla chiamata del metodo FileReference.upload(), il file selezionato viene trasferito nel server. Se l'utente seleziona più file mediante il metodo FileReferenceList.browse(), viene creato automaticamente un array dei file selezionati denominato FileReferenceList.fileList. A questo punto potete utilizzare il metodo FileReference.upload() per caricare ogni file individualmente. Nota: il metodo FileReference.browse() consente di caricare solo file singoli. Per consentire a un utente di caricare più file, utilizzate il metodo FileReferenceList.browse().
Per impostazione predefinita, la finestra di dialogo del selettore del sistema consente agli utenti di selezionare qualsiasi tipo di file dal computer locale. Gli sviluppatori possono specificare uno o più filtri per tipi di file personalizzati utilizzando la classe FileFilter e passando un array di istanze di FileFilter al metodo 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);
Dopo che l'utente ha selezionato i file e ha fatto clic sul pulsante Apri nel selettore del sistema, viene inviato l'evento Event.SELECT. Se per selezionare un file da caricare viene utilizzato il metodo FileReference.browse(), il codice riportato di seguito invia il file a un server 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");
}
Potete inviare dati al server con il metodo FileReference.upload() utilizzando le proprietà URLRequest.method e URLRequest.data per inviare variabili mediante il metodo POST o GET.Quando tentate di caricare un file utilizzando il metodo FileReference.upload(), è possibile che vengano inviati gli eventi seguenti:
Flash Player non offre il supporto completo per i server che richiedono l'autenticazione. Solo i file SWF eseguiti in un browser che utilizza il plug-in o il controllo Microsoft ActiveX® possono fornire una finestra di dialogo per richiedere l'inserimento del nome utente e della password di autenticazione e quindi solo per operazioni di scaricamento. Per i caricamenti mediante il plug-in o il controllo ActiveX o per il caricamento/scaricamento mediante un lettore autonomo o esterno, il trasferimento dei file non è possibile.Per creare uno script server in ColdFusion per accettare il caricamento di un file da Flash Player, potete utilizzare codice analogo a quello riportato di seguito: <cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />
Questo codice ColdFusion carica il file inviato da Flash Player e lo salva nella stessa directory del modello di ColdFusion, sovrascrivendo gli eventuali file con lo stesso nome. Il codice sopra riportato rappresenta la quantità minima di codice necessaria per accettare il caricamento di un file; non utilizzare questo script in un ambiente di produzione. Idealmente è opportuno aggiungere la convalida dei dati per assicurare che gli utenti carichino solo i tipi di file accettati, ad esempio un'immagine anziché uno script sul lato server potenzialmente pericoloso. Il codice riportato di seguito illustra il caricamento di file utilizzando PHP e include la convalida dei dati. Lo script limita a 10 il numero di file caricati nella directory di caricamento, assicura che le dimensioni del file siano inferiori a 200 KB e consente il caricamento e il salvataggio nel file system solo di file JPEG, GIF o 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;
}
}
?>
Potete passare variabili aggiuntive allo script di caricamento utilizzando il metodo di richiesta POST o GET. Per inviare variabili POST aggiuntive allo script di caricamento, è possibile utilizzare il codice riportato di seguito: 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");
}
Nell'esempio precedente viene creato un oggetto URLVariables che viene passato allo script sul lato server remoto. Nelle versioni precedenti di ActionScript era possibile passare variabili allo script di caricamento sul server mediante valori inclusi nella stringa di query. ActionScript 3.0 consente di passare le variabili allo script remoto utilizzando un oggetto URLRequest, che consente di passare i dati utilizzando il metodo POST o GET; in questo modo diventa inoltre più semplice passare set di dati più estesi. Per specificare se le variabili vengono passate utilizzando il metodo di richiesta GET o POST, potete impostare la proprietà URLRequest.method rispettivamente su URLRequestMethod.GET o su URLRequestMethod.POST. ActionScript 3.0 consente inoltre di ignorare il nome di campo del file di caricamento predefinito Filedata fornendo un secondo parametro al metodo upload(), come illustrato nell'esempio precedente (dove il valore predefinito Filedata è stato sostituito con Custom1). Per impostazione predefinita, Flash Player non tenta di inviare un caricamento di prova, anche se è possibile ignorare questa impostazione passando il valore true come terzo parametro al metodo upload(). Lo scopo del caricamento di prova è di verificare se il caricamento del file vero e proprio darà esito positivo, così come l'autenticazione sul server (se richiesta). Nota: attualmente il caricamento di prova è disponibile solo per Flash Player in ambiente Windows.
Lo script server che gestisce il caricamento del file deve prevedere una richiesta POST HTTP con gli elementi seguenti:
Di seguito è riportato un esempio di richiesta HTPP 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,,,) La richiesta POST HTTP di esempio invia tre variabili POST: api_sig, api_key e auth_token e utilizza il valore nome del campo dati di caricamento personalizzato "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-- Scaricamento di file da un serverPotete consentire agli utenti di scaricare file da un server utilizzando il metodo FileReference.download(), che accetta due parametri: request e defaultFileName. Il primo parametro è l'oggetto URLRequest che contiene l'URL del file da scaricare. Il secondo parametro è facoltativo e consente di specificare un nome file predefinito che verrà visualizzato nella finestra di dialogo di scaricamento del file. Se omettete il secondo parametro, defaultFileName, viene utilizzato il nome file dall'URL specificato. Il codice riportato di seguito consente di scaricare un file di nome index.xml dalla stessa directory del file SWF: var request:URLRequest = new URLRequest("index.xml");
var fileRef:FileReference = new FileReference();
fileRef.download(request);
Per impostare il nome predefinito su currentnews.xml anziché su index.xml, specificate il parametro defaultFileName, come illustrato nello snippet di codice riportato di seguito: var request:URLRequest = new URLRequest("index.xml");
var fileToDownload:FileReference = new FileReference();
fileToDownload.download(request, "currentnews.xml");
La capacità di rinominare un file può risultare utile se il nome file del server non è intuitivo o è stato generato dal server. È inoltre opportuno specificare il parametro defaultFileName quando scaricate un file utilizzando uno script sul lato server, anziché direttamente. Ad esempio, dovete specificare il parametro defaultFileName se utilizzate uno script sul lato server che scarica i file in base alle variabili URL passate. Diversamente, il nome predefinito del file scaricato corrisponde al nome dello script sul lato server. Potete inviare dati al server tramite il metodo download() aggiungendo dei parametri all'URL, che lo script server deve analizzare. Lo snippet di codice ActionScript 3.0 riportato di seguito consente di scaricare un documento in base ai parametri passati a uno script 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.");
}
}
}
}
Il codice riportato di seguito illustra lo script ColdFusion, download.cfm, che scarica uno dei due file dal server, a seconda del valore di una variabile 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>
Classe FileReferenceListLa classe FileReferenceList consente all'utente di selezionare uno o più file da caricare in uno script sul lato server. Il caricamento del file viene gestito dal metodo FileReference.upload(), che deve essere chiamato su ogni file selezionato dall'utente. Il codice riportato di seguito crea due oggetti FileFilter (imageFilter e textFilter) e li passa in un array al metodo FileReferenceList.browse(). Di conseguenza, nella finestra di dialogo dei file del sistema operativo vengono visualizzati due possibili filtri per i tipi di file. 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.");
}
Consentire all'utente di selezionare e caricare uno o più file utilizzando la classe FileReferenceList è come utilizzare FileReference.browse() per selezionare i file, anche se FileReferenceList consente di selezionare più di un file. Per caricare più file, è necessario utilizzare FileReference.upload() per caricare ogni file selezionato, come illustrato dal codice riportato di seguito: 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");
}
Poiché l'evento Event.COMPLETE viene aggiunto a ogni singolo oggetto FileReference nell'array, viene chiamato automaticamente il metodo completeHandler() al termine del caricamento di ogni file. |
|