Uso della classe FileReference

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

Adobe consiglia

Load and Save Local Files

Kevin Hoyt
In questo video, Kevin Hoyt spiega come sia facile caricare e salvare il contenuto locale con Flash.

Classe FileReference

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

  • Utilizzando l'operatore new come mostrato nel codice riportato di seguito:
    import flash.net.FileReference; 
    var fileRef:FileReference = new FileReference();
  • Chiamando il metodo FileReferenceList.browse() che apre una finestra di dialogo che chiede all'utente di selezionare uno o più file da caricare. Crea quindi un array di oggetti FileReference se l'utente seleziona uno o più file.

Dopo aver creato un oggetto FileReference, potete:

  • Chiamare il metodo FileReferenceList.browse() che apre una finestra di dialogo che chiede all'utente di selezionare un solo file dal file system locale. Questa operazione viene in genere eseguita prima di una successiva chiamata al metodo FileReference.upload() o al metodo FileReference.load(). Chiamare il metodo FileReference.upload() per caricare il su un server remoto. Chiamare il metodo FileReference.load() per aprire un file locale.

  • Chiamare il metodo FileReference.download(). Il metodo download() apre una finestra di dialogo che consente all'utente di selezionare un percorso per il salvataggio di un nuovo file, quindi scarica i dati dal server e li archivia nel nuovo file.

  • Chiamare il metodo FileReference.load(). Questo metodo inizia a caricare i dati da un file selezionato in precedenza mediante il metodo browse(). Il metodo load() non può essere chiamato prima del completamento dell'operazione browse() (l'utente seleziona un file).

  • Chiamare il metodo FileReference.save(). Questo metodo apre una finestra di dialogo e chiede all'utente di scegliere un solo percorso di file nel file system locale e quindi salva i dati nel percorso specificato.

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:

  • È stato chiamato il metodo FileReference.browse() o FileReferenceList.browse() e l'utente ha selezionato un file mediante la finestra di dialogo.

  • È stato chiamato il metodo FileReference.download() e l'utente ha specificato un nuovo percorso per il file mediante la finestra di dialogo.

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 file

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

  • evento open (Event.OPEN): inviato quando inizia l'operazione di caricamento.

  • evento progress (ProgressEvent.PROGRESS): inviato periodicamente mentre vengono letti byte di dati dal file.

  • evento complete (Event.COMPLETE): inviato quando l'operazione di caricamento viene completata correttamente.

  • evento ioError (IOErrorEvent.IO_ERROR): inviato se il processo di caricamento non riesce a causa di un errore di input/output verificatosi durante l'apertura o la lettura dei dati dal file.

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 locali

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

  • evento select (Event.SELECT): inviato quando l'utente specifica il percorso e il nome del file per il nuovo file da salvare.

  • evento cancel (Event.CANCEL): inviato quando l'utente fa clic sul pulsante Annulla nella finestra di dialogo.

  • evento open (Event.OPEN): inviato quando inizia l'operazione di salvataggio.

  • evento progress (ProgressEvent.PROGRESS): inviato periodicamente mentre vengono salvati byte di dati nel file.

  • evento complete (Event.COMPLETE): inviato quando l'operazione di salvataggio viene completata correttamente.

  • evento ioError (IOErrorEvent.IO_ERROR): inviato se il processo di salvataggio non riesce a causa di un errore di input/output durante il tentativo di salvare dati nel file.

Il tipo di oggetto passato nel parametro data del metodo FileReference.save() determina in che modo i dati vengono scritti nel file:

  • Se si tratta di un valore stringa, questo viene salvato come file di testo mediante la codifica UTF-8.

  • Se si tratta di un oggetto XML, questo viene scritto in un file in formato XML mantenendo tutta la formattazione.

  • Se si tratta di un oggetto ByteArray, il suo contenuto viene scritto direttamente nel file senza eseguire conversioni.

  • Se si tratta di altri oggetti, il metodo FileReference.save() chiama il metodo toString() dell'oggetto e quindi salva il risultante valore stringa in un file di testo UTF-8. Se il metodo toString() dell'oggetto non può essere chiamato, viene generato un errore.

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 server

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

  • evento open (Event.OPEN): inviato quando inizia l'operazione di caricamento.

  • evento progress (ProgressEvent.PROGRESS): inviato periodicamente mentre vengono caricati byte di dati dal file.

  • evento complete (Event.COMPLETE): inviato quando l'operazione di caricamento viene completata correttamente.

  • evento httpStatus (HTTPStatusEvent.HTTP_STATUS): inviato quando il processo di caricamento non viene completato a causa di un errore HTTP.

  • evento httpResponseStatus (HTTPStatusEvent.HTTP_RESPONSE_STATUS): inviato se una chiamata al metodo the upload() o uploadUnencoded() tenta di accedere a dati tramite HTTP e Adobe AIR è in grado di rilevare e restituire il codice di stato della richiesta.

  • evento securityError (SecurityErrorEvent.SECURITY_ERROR): inviato quando un'operazione di caricamento non viene completata a causa di una violazione della sicurezza.

  • evento uploadCompleteData (DataEvent.UPLOAD_COMPLETE_DATA): inviato dopo la ricezione di dati dal server in seguito a un caricamento riuscito.

  • evento ioError (IOErrorEvent.IO_ERROR): inviato quando il processo di caricamento non viene completato per uno dei motivi seguenti:

    • Si verifica un errore di input/output durante la lettura, la scrittura o la trasmissione del file da parte del lettore.

    • Il file SWF ha tentato di caricare un file su un server che richiede l'autenticazione (ad esempio, un nome utente e una password). Durante il caricamento, Flash Player non fornisce all'utente un modo per immettere una password.

    • Il parametro url contiene un protocollo non valido. Il metodo FileReference.upload() deve utilizzare HTTP o HTTPS.

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:

  • Content-Type con un valore multipart/form-data.

  • Content-Disposition con un attributo name impostato su “ Filedata” e un attributo filename impostato sul nome del file originale. Potete specificare un attributo name personalizzato passando un valore per il parametro uploadDataFieldName nel metodo FileReference.upload().

  • Il contenuto binario del file.

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 server

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

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