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