Ein FileReference-Objekt repräsentiert eine Datendatei auf einem Client oder Server. Mit den Methoden der FileReference-Klasse kann Ihre Anwendung Datendateien lokal laden und speichern sowie Dateidaten zwischen Remote-Servern übertragen.
Die FileReference-Klasse bietet zwei verschiedene Verfahren zum Laden, Übertragen und Speichern von Datendateien. Seit ihrer Einführung enthält die FileReference-Klasse die Methoden
browse()
,
upload()
und
download()
. Verwenden Sie die
browse()
-Methode, um dem Benutzer die Möglichkeit zu geben, eine Datei auszuwählen. Verwenden Sie die
upload()
-Methode, um die Daten der Datei auf einen Remoteserver zu übertragen. Verwenden Sie die
download()
-Methode, um diese Daten vom Server abzurufen und in einer lokalen Datei zu speichern. Ab Flash Player 10 und Adobe AIR 1.5 enthält die FileReference-Klasse die Methoden
load()
und
save()
. Mit den Methoden
load()
und
save()
können Sie lokale Dateien auch direkt aufrufen und speichern. Die Verwendung dieser Methoden ähnelt der Verwendung der gleichnamigen Methoden der URLLoader- und Loader-Klassen.
Hinweis:
Die File-Klasse, die die FileReference-Klasse erweitert, und die FileStream-Klasse bieten zusätzliche Funktionen für die Arbeit mit Dateien und dem lokalen Dateisystem. Die File-Klasse und die FileStream-Klasse werden nur in AIR, nicht in Flash Player unterstützt.
FileReference-Klasse
Jedes FileReference-Objekt stellt eine einzelne Datendatei auf dem lokalen Computer dar. Die Eigenschaften der FileReference-Klasse umfassen Informationen zu Dateigröße, Dateityp, Dateiname, Dateinamenerweiterung, Ersteller, Erstellungs- sowie Änderungsdatum.
Hinweis:
Die
creator
-Eigenschaft wird nur unter Mac OS unterstützt. Auf allen anderen Plattformen wird
null
zurückgegeben.
Hinweis:
Die
extension
-Eigenschaft wird nur in Adobe AIR unterstützt.
Eine Instanz der FileReference-Klasse kann mit zwei Verfahren erstellt werden:
-
Verwenden Sie den
new
-Operator, wie im folgenden Codebeispiel gezeigt:
import flash.net.FileReference;
var fileRef:FileReference = new FileReference();
-
Rufen Sie die Methode
FileReferenceList.browse()
auf. Dadurch wird ein Dialogfeld geöffnet, in dem der Benutzer aufgefordert wird, eine oder mehrere Dateien für den Upload auszuwählen. Nachdem der Benutzer eine oder mehrere Dateien ausgewählt hat, wird ein Array aus FileReference-Objekten erstellt.
Nach der Erstellung eines FileReference-Objekts haben Sie folgende Möglichkeiten:
-
Rufen Sie die
FileReference.browse()
-Methode auf. Dadurch wird ein Dialogfeld geöffnet, in dem der Benutzer aufgefordert wird, genau eine Datei im lokalen Dateisystem auszuwählen. Dies erfolgt normalerweise vor einem späteren Aufruf der Methode
FileReference.upload()
oder
FileReference.load()
. Rufen Sie die
FileReference.upload()
-Methode auf, um die Datei auf einen Remoteserver hochzuladen. Rufen Sie die
FileReference.load()
-Methode auf, um eine lokale Datei zu öffnen.
-
Rufen Sie die
FileReference.download()
-Methode auf. Die
download
-Methode öffnet ein Dialogfeld, in dem der Benutzer ein Verzeichnis zum Speichern einer neuen Datei auswählen kann. Dann werden Daten vom Server heruntergeladen und in der neuen Datei gespeichert.
-
Rufen Sie die
FileReference.load()
- Methode auf. Diese Methode beginnt, Daten aus einer vor Verwendung der
browse()
-Methode ausgewählten Datei zu laden. Die
load()
-Methode kann erst aufgerufen werden, wenn der
browse()
-Vorgang abgeschlossen ist (der Benutzer eine Datei auswählt).
-
Rufen Sie die
FileReference.save()
-Methode auf. Diese Methode öffnet ein Dialogfeld und fordert den Benutzer auf, einen einzelnen Dateispeicherort im lokalen Dateisystem auszuwählen. Die Daten werden dann am angegebenen Speicherort gespeichert.
Hinweis:
Es kann immer nur jeweils eine
browse()
-,
download()
- oder
save
-Aktion durchgeführt werden, da immer nur ein Dialogfeld geöffnet sein kann.
Die Eigenschaften des FileReference-Objekts, wie
name
,
size
oder
modificationDate
, werden erst nach einem der folgenden Vorgänge definiert:
-
Die
FileReference.browse()
-Methode oder die
FileReferenceList.browse()
-Methode wurde aufgerufen und der Benutzer hat eine Datei im Dialogfeld ausgewählt.
-
Die
FileReference.download()
-Methode wurde aufgerufen und der Benutzer hat ein neues Verzeichnis für die Datei im Dialogfeld angegeben.
Hinweis:
Während eines Downloads ist nur die Eigenschaft
FileReference.name
mit Daten gefüllt, bevor der Download abgeschlossen ist. Nachdem die Datei heruntergeladen wurde, stehen alle Eigenschaften zur Verfügung.
Während Aufrufe der Methode
FileReference.browse()
,
FileReferenceList.browse()
,
FileReference.download()
,
FileReference.load()
oder
FileReference.save()
ausgeführt werden, setzen die meisten Player die Wiedergabe der SWF-Datei fort, einschließlich Ereignisauslösung und Codeausführung.
Bei Upload- und Download-Vorgängen kann mit einer SWF-Datei nur auf Dateien in der eigenen Domäne und in den in einer Richtliniendatei angegebenen Domänen zugegriffen werden. Sie müssen auf dem Server mit der Datei eine Richtliniendatei ablegen, falls sich dieser Server nicht in derselben Domäne wie die SWF-Datei befindet, die den Upload oder Download eingeleitet hat.
Siehe
FileReference
.
Laden von Daten aus Dateien
Mit der
FileReference.load()
-Methode können Sie Daten aus einer lokalen Datei in den Arbeitsspeicher laden.
Hinweis:
Der Code muss zuerst die
FileReference.browse()
-Methode aufrufen, damit der Benutzer die zu ladende Datei auswählen kann. Diese Einschränkung gilt nicht für Inhalt, der in der Anwendungs-Sicherheits-Sandbox in Adobe AIR ausgeführt wird.
Die Rückgabe von der
FileReference.load()
-Methode erfolgt direkt nach dem Aufrufen, die Daten, die geladen werden, stehen jedoch nicht sofort zur Verfügung. Das FileReference-Objekt löst Ereignisse aus, um bei jedem Schritt des Ladevorgangs Listener-Methoden aufzurufen.
Das FileReference-Objekt löst beim Speichern der Datei die folgenden Ereignisse aus.
-
open
-Ereignis (
Event.OPEN
): Wird ausgelöst, wenn der Ladevorgang beginnt.
-
progress
-Ereignis (
ProgressEvent.PROGRESS
): Wird regelmäßig ausgelöst, während Daten-Bytemengen aus der Datei gelesen werden.
-
complete
-Ereignis (
Event.COMPLETE
): Wird ausgelöst, wenn das Laden erfolgreich abgeschlossen wurde.
-
ioError
-Ereignis (
IOErrorEvent.IO_ERROR
): Wird ausgelöst, wenn der Ladevorgang fehlschlägt, weil beim Öffnen der Datei oder beim Lesen von Daten aus der Datei ein Eingabe-/Ausgabefehler auftritt.
Nachdem das FileReference-Objekt das complete-Ereignis ausgelöst hat, kann auf die geladenen Daten als ein ByteArray in der
data
-Eigenschaft des FileReference-Objekts zugegriffen werden.
Im folgenden Codebeispiel wird gezeigt, wie der Benutzer zur Auswahl einer Datei aufgefordert wird und wie die Daten dann aus dieser Datei in den Arbeitsspeicher geladen werden:
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.");
}
}
}
Der Beispielcode erstellt zuerst das FileReference-Objekt mit den Namen
fileRef
und ruft dann dessen
browse()
-Methode auf. Die
browse
-Methode öffnet ein Dialogfeld, das den Benutzer zum Auswählen einer Datei auffordert. Wenn eine Datei ausgewählt wird, ruft der Code die
onFileSelected()
-Methode auf. Diese Methode fügt Listener für die
progress
- und
complete
-Ereignisse hinzu und ruft dann die
load()
-Methode des FileReference-Objekts auf. Die anderen Prozedurmethoden im Beispiel geben Meldungen aus, um den Fortschritt des Ladevorgangs zu melden. Wenn der Ladevorgang abgeschlossen ist, zeigt die Anwendung den Inhalt der geladenen Datei mithilfe der
trace()
-Methode an.
In Adobe AIR bietet die FileStream-Klasse zusätzliche Funktionen zum Lesen von Daten aus einer lokalen Datei. Lesen Sie dazu
Lese- und Schreibvorgänge in Dateien
.
Speichern von Daten in lokalen Dateien
Mit der
FileReference.save()
-Methode können Sie Daten in einer lokalen Datei speichern. Zunächst wird ein Dialogfeld geöffnet, in dem der Benutzer einen neuen Dateinamen sowie das Verzeichnis zum Speichern der Datei eingeben kann. Nachdem der Benutzer den Dateinamen und den Speicherort ausgewählt hat, werden die Daten in die neue Datei geschrieben. Wenn die Datei erfolgreich gespeichert wurde, werden die Eigenschaften des FileReference-Objekts mit den Eigenschaften der lokalen Datei gefüllt.
Hinweis:
Im Code kann die
FileReference.save()
-Methode nur als Reaktion auf ein vom Benutzer initiiertes Ereignis aufgerufen werden, wie beispielsweise ein Mausklick- oder Tastendruck-Ereignis. Andernfalls wird ein Fehler ausgegeben. Diese Einschränkung gilt nicht für Inhalt, der in der Anwendungs-Sicherheits-Sandbox in Adobe AIR ausgeführt wird.
Die Rückgabe der
FileReference.save()
-Methode erfolgt unmittelbar nach ihrem Aufruf. Dann löst das FileReference-Objekt Ereignisse aus, um bei jedem Schritt des Speichervorgangs Listener-Methoden aufzurufen.
Das FileReference-Objekt löst beim Speichern der Datei die folgenden Ereignisse aus:
-
select
-Ereignis (
Event.SELECT
): Wird ausgelöst, wenn der Benutzer das Verzeichnis und den Dateinamen für die neue Datei festlegt, die gespeichert werden soll.
-
cancel
-Ereignis (
Event.CANCEL
): Wird ausgelöst, wenn der Benutzer im Dialogfeld auf die Schaltfläche „Abbrechen“ klickt.
-
open
-Ereignis (
Event.OPEN
): Wird ausgelöst, wenn der Speichervorgang beginnt.
-
progress
-Ereignis (
ProgressEvent.PROGRESS
): Wird regelmäßig ausgelöst, während Daten-Bytemengen in der Datei gespeichert werden.
-
complete
-Ereignis (
Event.COMPLETE
): Wird ausgelöst, wenn das Speichern erfolgreich abgeschlossen wurde.
-
ioError
-Ereignis (
IOErrorEvent.IO_ERROR
): Wird ausgelöst, wenn der Speichervorgang fehlschlägt, weil beim Versuch, die Daten in der Datei zu speichern, ein Eingabe-/Ausgabefehler auftritt.
Der im
data
-Parameter der
FileReference.save()
-Methode übergebene Objekttyp bestimmt, wie die Daten in die Datei geschrieben werden:
-
Bei einem String-Wert werden die Daten als Textdatei in UTF-8-Kodierung gespeichert.
-
Bei einem XML-Objekt werden die Daten in eine Datei im XML-Format geschrieben, wobei die gesamte Formatierung beibehalten wird.
-
Bei einem ByteArray-Objekt wird der Inhalt ohne Konvertierung direkt in die Datei geschrieben.
-
Bei allen anderen Objekten ruft die
FileReference.save()
-Methode die
toString()
-Methode des Objekts auf und speichert dann den resultierenden String-Wert in einer Textdatei in UTF-8-Kodierung. Wenn die
toString()
-Methode des Objekts nicht aufgerufen werden kann, wird ein Fehler ausgegeben.
Wenn der
data
-Parameter den Wert
null
hat, wird ein Fehler ausgegeben.
Der folgende Code erweitert das vorstehende Beispiel für die
FileReference.load()
-Methode. Nachdem die Daten aus der Datei gelesen wurden, wird der Benutzer in diesem Beispiel zur Angabe eines Dateinamens aufgefordert. Dann werden die Daten in einer neuen Datei gespeichert:
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.");
}
}
}
Wenn alle Daten aus der Datei geladen wurden, ruft der Code die
onComplete()
-Methode auf. Die
onComplete()
-Methode entfernt die Listener für die Ladeereignisse und ruft dann die
saveFile()
-Methode auf. Die
saveFile()
-Methode ruft die
FileReference.save()
-Methode auf. Die
FileReference.save()
-Methode öffnet ein neues Dialogfeld, in dem der Benutzer einen neuen Dateinamen eingeben und den Speicherort der Datei auswählen kann. Die restlichen Ereignis-Listener-Methoden verfolgen den Fortschritt des Speichervorgangs bis zum Abschluss.
In Adobe AIR bietet die FileStream-Klasse zusätzliche Funktionen zum Schreiben von Daten in eine lokale Datei. Lesen Sie dazu
Lese- und Schreibvorgänge in Dateien
.
Hochladen von Dateien auf einen Server
Zum Hochladen von Dateien auf einen Server rufen Sie zunächst die
browse()
-Methode auf, damit ein Benutzer eine oder mehrere Dateien auswählen kann. Dann, nachdem die
FileReference.upload()
-Methode aufgerufen wurde, wird die ausgewählte Datei an den Server übertragen. Wählt der Benutzer mehrere Dateien mit der Methode
FileReferenceList.browse()
aus, erstellt Flash Player ein Array der ausgewählten Dateien mit der Bezeichnung
FileReferenceList.fileList
. Sie können dann die
FileReference.upload()
-Methode verwenden, um die Dateien einzeln hochzuladen.
Hinweis:
Mit der
FileReference.browse()
-Methode können Sie nur einzelne Dateien hochladen. Um einem Benutzer das Hochladen mehrerer Dateien zu ermöglichen, verwenden Sie die
FileReferenceList.browse()
-Methode.
Standardmäßig können Benutzer auf dem lokalen Computer einen beliebigen Dateityp im Dialogfeld zur Dateiauswahl auswählen. Entwickler können mit der FileFilter-Klasse und durch Übergeben eines Arrays mit Dateifilterinstanzen an die
browse()
-Methode einen oder mehrere benutzerdefinierte Filter für Dateitypen angeben:
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);
Nachdem der Benutzer die Dateien ausgewählt und im Dialogfeld zur Dateiauswahl auf die Schaltfläche zum Öffnen der Datei geklickt hat, wird das
Event.SELECT
-Ereignis ausgelöst. Wird die
FileReference.browse()
-Methode zur Auswahl einer hochzuladenden Datei verwendet, sendet der folgende Code die Datei an einen Webserver:
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");
}
Mit der
FileReference.upload()
-Methode können Sie Daten an den Server senden, indem Sie die Eigenschaften
URLRequest.method
und
URLRequest.data
verwenden, um Variablen mit den Methoden
POST
oder
GET
zu senden.
Wenn Sie versuchen, eine Datei mit der
FileReference.upload()
-Methode hochzuladen, werden die folgenden Ereignisse ausgelöst:
-
open
-Ereignis (
Event.OPEN
): Wird ausgelöst, wenn der Uploadvorgang beginnt.
-
progress
-Ereignis (
ProgressEvent.PROGRESS
): Wird regelmäßig ausgelöst, während Daten-Bytemengen aus der Datei hochgeladen werden.
-
complete
-Ereignis (
Event.COMPLETE
): Wird ausgelöst, wenn der Uploadvorgang erfolgreich abgeschlossen wurde.
-
httpStatus
-Ereignis (
HTTPStatusEvent.HTTP_STATUS
): Wird ausgelöst, wenn ein Upload-Vorgang aufgrund eines HTTP-Fehlers fehlschlägt.
-
httpResponseStatus
-Ereignis (
HTTPStatusEvent.HTTP_RESPONSE_STATUS
): Wird ausgelöst, wenn ein Aufruf der
upload()
- oder
uploadUnencoded()
-Methode versucht, über HTTP auf Daten zuzugreifen, und Adobe AIR den Statuscode für die Anforderung erkennen und zurückgeben kann.
-
securityError
-Ereignis (
SecurityErrorEvent.SECURITY_ERROR
): Wird ausgelöst, wenn ein Upload-Vorgang aufgrund einer Sicherheitsverletzung fehlschlägt.
-
uploadCompleteData
-Ereignis
DataEvent.UPLOAD_COMPLETE_DATA
): Wird ausgelöst, nachdem Daten vom Server nach einem erfolgreichen Upload empfangen wurden.
-
ioError
-Ereignis (
IOErrorEvent.IO_ERROR
): Wird ausgelöst, wenn der Upload-Vorgang aus einem der folgenden Gründe fehlschlägt:
-
Während des Lese-, Schreib- oder Übertragungsvorgangs durch Flash Player ist ein Eingabe/Ausgabe-Fehler aufgetreten.
-
Die SWF-Datei versuchte, eine Datei auf einen Server hochzuladen, der eine Authentifizierung erfordert (z. B. anhand eines Benutzernamens und eines Kennworts). Während des Uploads stellt Flash Player keine Möglichkeiten für die Eingabe von Kennwörtern durch die Benutzer bereit.
-
Der Parameter
url
enthält ein ungültiges Protokoll. Die
FileReference.upload()
-Methode muss entweder HTTP oder HTTPS verwenden.
Flash Player bietet keine Unterstützung für Server, die eine Authentifizierung erfordern. Nur bei SWF-Dateien, die in einem Browser mithilfe des Browser-Plug-Ins oder des Microsoft ActiveX®-Steuerelements ausgeführt werden, kann der Benutzer in einem Dialogfeld zur Eingabe eines Benutzernamens und eines Kennworts zur Authentifizierung aufgefordert werden. Dies gilt jedoch nur für Downloadvorgänge. Upload-Vorgänge mit Plug-Ins oder ActiveX-Steuerelementen bzw. Upload/Download-Vorgänge mit dem eigenständigen oder externen Player schlagen fehl.
Wenn Sie ein Serverskript in ColdFusion erstellen möchten, um einen Datei-Upload von Flash Player zu akzeptieren, können Sie Code wie den Folgenden verwenden:
<cffile action="upload" filefield="Filedata" destination="#ExpandPath('./')#" nameconflict="OVERWRITE" />
Dieser ColdFusion-Code lädt die von Flash Player gesendete Datei hoch und speichert sie im gleichen Verzeichnis wie die ColdFusion-Vorlage. Dabei wird eine Datei mit dem gleichen Namen überschrieben. Das vorangegangene Codebeispiel zeigt den mindestens erforderlichen Code, der zum Akzeptieren eines Datei-Uploads erforderlich ist. Dieses Skript sollte in einer Produktionsumgebung nicht verwendet werden. Im Idealfall fügen Sie eine Datenvalidierung hinzu, um sicherzustellen, dass Benutzer nur akzeptierte Dateitypen hochladen, beispielsweise eine Bilddatei anstelle eines potenziell gefährlichen serverseitigen Skripts.
Der folgende Code demonstriert Datei-Uploads mithilfe von PHP und umfasst eine Datenvalidierung. Das Skript beschränkt die Anzahl der hochgeladenen Dateien im Upload-Verzeichnis auf 10, und stellt sicher, dass die Datei kleiner als 200 KB ist. Weiterhin werden das Hochladen und die Speicherung im Dateisystem auf Dateien des Typs JPEG, GIF oder PNG beschränkt.
<?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;
}
}
?>
Mit der
POST
- oder
GET
-Anforderungsmethode können Sie zusätzliche Variablen an das Upload-Skript übergeben. Sie können den folgenden Code verwenden, um zusätzliche
POST
-Variablen an Ihr Upload-Skript zu übergeben:
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");
}
Das vorangegangene Codebeispiel erstellt ein URLVariables-Objekt, das Sie an das externe serverseitige Skript übergeben. In früheren Versionen von ActionScript konnten Sie Variablen durch Angabe von Werten im Abfrage-String an das Server-Upload-Skript übergeben. Mit ActionScript 3.0 können Sie Variablen mit einem URLRequest-Objekt an das externe Skript übergeben. Dies ermöglicht Ihnen die Übergabe von Daten mit der
POST
- oder
GET
-Methode, und das wiederum macht die Übergabe längerer Datensätze einfacher und übersichtlicher. Um anzugeben, welche Variablen mit der Anforderungsmethode
GET
oder
POST
übergeben werden, können Sie die Eigenschaft
URLRequest.method
auf
URLRequestMethod.GET
bzw.
URLRequestMethod.POST
einstellen.
ActionScript 3.0 ermöglicht Ihnen darüber hinaus das Überschreiben des standardmäßigen Namens für das
Filedata
-Upload-Dateifeld, indem Sie einen zweiten Parameter für die Methode
upload()
angeben. Dies wurde im vorangegangenen Codebeispiel demonstriert (in dem der Standardwert
Filedata
durch
Custom1
ersetzt wurde).
In der Standardeinstellung versucht Flash Player nicht, einen Test-Upload zu senden, obwohl Sie diese Standardeinstellung außer Kraft setzen können, indem Sie
true
als dritten Parameter für die
upload()
-Methode angeben. Der Zweck eines Test-Upload besteht darin, zu überprüfen, ob der tatsächliche Datei-Upload erfolgreich verlaufen wird und ob eine Authentifizierung beim Server (falls erforderlich) erfolgreich sein wird.
Hinweis:
Ein Test-Upload findet derzeit nur bei Windows-basierten Flash Player-Versionen statt.
Das den Upload verwaltende Serverskript erwartet eine HTTP
POST
-Anforderung mit den folgenden Elementen:
-
Content-Type
mit einem Wert von
multipart/form-data
-
Content-Disposition
mit einem Attribut
name
, das auf
„Filedata"
eingestellt ist, und mit einem Attribut
filename
, das auf den Namen der Originaldatei eingestellt ist. Sie können ein benutzerdefiniertes
name
-Attribut angeben, indem Sie einen Wert für den
uploadDataFieldName
-Parameter in der
FileReference.upload()
-Methode übergeben.
-
Die binären Inhalte der Datei.
Im Folgenden finden Sie ein Beispiel einer HTTP
POST
-Anforderung:
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,,,)
Das folgende Beispiel einer HTTP
POST
-Anforderung sendet drei
POST
-Variablen:
api_sig
,
api_key
und
auth_token
. Weiterhin wird ein benutzerdefinierter Upload-Datenfeldname von
„photo"
verwendet:
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--
Herunterladen von Dateien von einem Server
Mit der Methode
FileReference.download()
können Sie Benutzern das Herunterladen von Dateien von einem Server ermöglichen. Dieser Methode lässt zwei Parametern zu:
request
und
defaultFileName
. Der erste Parameter ist ein URLRequest-Objekt, das die URL der herunterzuladenden Datei enthält. Der zweite Parameter ist optional. Mit ihm können Sie einen standardmäßigen Dateinamen angeben, der im Dialogfeld zum Herunterladen der Datei angezeigt wird. Wenn Sie den zweiten Parameter,
defaultFileName
, weglassen, wird der Dateiname aus der angegebenen URL verwendet.
Mit dem folgenden Code wird eine Datei namens „index.xml“ aus dem gleichen Verzeichnis wie die SWF-Datei heruntergeladen:
var request:URLRequest = new URLRequest("index.xml");
var fileRef:FileReference = new FileReference();
fileRef.download(request);
Um den Standardnamen von „index.xml“ in „currentnews.xml“ zu ändern, verwenden Sie den
defaultFileName
-Parameter. Dies wird im folgenden Codeausschnitt gezeigt:
var request:URLRequest = new URLRequest("index.xml");
var fileToDownload:FileReference = new FileReference();
fileToDownload.download(request, "currentnews.xml");
Das Umbenennen einer Datei ist insbesondere dann sinnvoll, wenn der Dateiname auf dem Server nicht besonders intuitiv ist oder vom Server erzeugt wurde. Außerdem sollten Sie den Parameter
defaultFileName
explizit angeben, wenn Sie eine Datei mit einem serverseitigen Skript und nicht direkt herunterladen. Beispielsweise müssen Sie den Parameter
defaultFileName
angeben, wenn Sie mit einem serverseitigen Skript arbeiten, das bestimmte Dateien basierend auf den an das Skript übergebenen URL-Variablen herunterlädt. Andernfalls wird der Name Ihres serverseitigem Skripts zum Standardnamen der heruntergeladenen Datei.
Daten können mit der
download()
-Methode an den Server übertragen werden, indem Sie der URL Parameter hinzufügen, die das Serverskript analysiert. Mit dem folgenden ActionScript 3.0-Codeausschnitt wird ein Dokument basierend auf den Parametern heruntergeladen, die an ein ColdFusion-Skript übergeben wurden:
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.");
}
}
}
}
Der folgende Code zeigt das ColdFusion-Skript „download.cfm“, das abhängig vom Wert der URL-Variablen eine von zwei Dateien vom Server herunterlädt:
<cfparam name="URL.id" default="1" />
<cfswitch expression="#URL.id#">
<cfcase value="2">
<cfcontent type="text/plain" file="#ExpandPath('two.txt')#" deletefile="No" />
</cfcase>
<cfdefaultcase>
<cfcontent type="text/plain" file="#ExpandPath('one.txt')#" deletefile="No" />
</cfdefaultcase>
</cfswitch>
FileReferenceList-Klasse
Mit der FileReferenceList-Klasse können Benutzer eine oder mehrere Dateien zum Hochladen an ein serverseitiges Skript auswählen. Der Datei-Upload wird von der
FileReference.upload()
-Methode verarbeitet, die für jede vom Benutzer ausgewählte Datei aufgerufen werden muss.
Mit dem folgenden Code werden zwei FileFilter-Objekte (
imageFilter
und
textFilter
) erstellt und in einem Array an die
FileReferenceList.browse()
-Methode übergeben. Dies sorgt dafür, dass das Datei-Dialogfeld des Betriebssystems zwei mögliche Filter für Dateitypen anzeigt.
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.");
}
Das Auswählen und Hochladen einer oder mehrerer Dateien mithilfe der FileReferenceList-Klasse ist das Gleiche wie das Verwenden von
FileReference.browse()
zur Auswahl von Dateien, obwohl mit FileReferenceList mehrere Dateien gleichzeitig ausgewählt werden können. Beim Hochladen mehrerer Dateien müssen Sie jede ausgewählte Datei mit
FileReference.upload()
hochladen. Dies wird im folgenden Code gezeigt:
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");
}
Da das Ereignis
Event.COMPLETE
jedem einzelnen FileReference-Objekt im Array hinzugefügt wird, ruft Flash Player die Methode
completeHandler()
auf, wenn das Hochladen für jede einzelne Datei abgeschlossen ist.
|
|
|