Flash 8 – Upload: Part I

Neben den vielen nützlichen Neuerungen für Designer in Flash 8 (wobei ich mich frage, wie Designer den Convolution-Filter und die Color-Matrix anwenden sollen, aber ich schweife ab …), finde ich persönlich die neue Upload Funktion von Flash nach wie vor sehr interessant. Vor Flash 8, gab es bereits einige Flash-Upload Umsetzungen, die jedoch mit vielen Fragezeichen behaftet waren, wie z.B. der Yamz Browser von Yamago

Soweit mir bekannt ist, gab es keine einzige Umsetzung, die Cross-Browser kompatibel war. Es gab große Einschränkungen, wie z.B. das JavaScript aktiviert sein muss.
Das Resultat dieser Einschränkungen war meist schlichtweg das man es nicht benutzte.

Seit es mit Flash 8 eine eigene Flashlösung gibt, die mit der Verwendung einer Serverside-Scriptsprache auskommt, sollte das anders sein und hier nehme ich schon mein Fazit?! vorweg.

Fangen wir vorne an. Es gibt ein neues Package: flash.net in dem man zwei neue Klassen FileReference und FileReferenceList findet. Der FileReference Klasse soll meiner Aufmerksamkeit im Besonderen gewidmet werden, da die FileReferenceList Klasse nur eine Erweiterung ist und keine zusätzliche Basisfunktionalität bietet.

Damit dieser Thread nicht zu theoretisch und langweilig wird, fangen wir mal direkt mit einer einfachen Upload-Anwendung an.
Die serverseitige Verarbeitung wird in diesem Beispiel mit PHP realisiert.

Screenshot

Download der Quelldateien

Initialisierung auf der Hauptzeitleiste:
[code]var myUploader:MUploader = new MUploader(this);
// Browse Button
var browseListener:Object = new Object();
browseListener.click = function() {
myUploader.browse();
};
browse_mc.addEventListener(„click“, browseListener);
// Upload Button
var uploadListener:Object = new Object();
uploadListener.click = function() {
myUploader.upload();
};
upload_mc.addEventListener(„click“, uploadListener);
// Refresh-Button
var refreshListener:Object = new Object();
refreshListener.click = function() {
myUploader.refreshFileList();
};
refresh_mc.addEventListener(„click“, refreshListener);
stop();[/code]

MUploader.as:
[code]/**
*
* @autor Nick Weschkalnies
* @description Uploader Version 1.0
*/
import flash.net.*;
import Delegate;
class MUploader {
private var fileList_lv:LoadVars;
private var fileRef:FileReference;
private var fileRefListener:Object;
private var target_mc:MovieClip;
private var fileList:mx.controls.List;
private var myFile_txt:TextField;
private var status_txt:TextField;
public function MUploader(mc:MovieClip) {
target_mc = mc;
fileList = target_mc.fileList;
refreshFileList();
myFile_txt = target_mc.myFile_txt;
status_txt = target_mc.status_txt;
fileRef = new FileReference();
fileRefListener = new Object();
fileRefListener.onSelect = Delegate.createPacked(this,fileSelected);
fileRefListener.onOpen = Delegate.createPacked(this,fileUploadStarted);
fileRefListener.onComplete = Delegate.createPacked(this,fileUploadCompleted);
fileRef.addListener(fileRefListener);
}
public function browse():Void {
var myFileExtension:Array = new Array({description:“Images“, extension:“*.jpg“});
fileRef.browse(myFileExtension);
}
private function fileSelected(fileRef:FileReference):Void {
myFile_txt.text = fileRef.name;
}
private function fileUploadStarted(fileRef:FileReference):Void {
status_txt.text = „Please wait …“;
}
public function upload():Void {
fileRef.upload(„upload.php“);
}
private function fileUploadCompleted(fileRef:FileReference):Void {
refreshFileList();
status_txt.text = „Upload completed“;
}
public function refreshFileList():Void {
fileList_lv = new LoadVars();
var zeitstempel:Number = new Date().getTime();
fileList_lv.sendAndLoad(„readDir.php?“+zeitstempel,fileList_lv,“POST“);
fileList_lv.onLoad = Delegate.createPacked(this,fileListRefreshed);
}
private function fileListRefreshed():Void {
var myFileArray = new Array()
myFileArray = fileList_lv.files.split(„,“);
fileList.removeAll();
for(var i:Number = 0;i $file) {
move_uploaded_file($file[‚tmp_name‘], „files/“.$file[’name‘]);
$myTempFile = „files/“.$file[’name‘];
chmod($myTempFile,0777);
}
?>[/code]

PHP (readDir.php):
[code][/code]

Das ist die Ausgangsbasis für diesen Thread, der in Kürze fortgesetzt wird.
Im nächsten Teil gehe ich auf ein Sicherheitsaspekt und einige erweiterte Fehlerabfragen ein, die hier noch nicht berücksichtigt wurden.

4 Gedanken zu „Flash 8 – Upload: Part I“

  1. Schöner Artikel, Nick. Eine Frage bleibt aber offen.
    Habe ich von Flash ans PHP-Skript die Datei übergeben, möchte ich einen serverseitigen Check ausführen, ob diese Datei Anspruch XYZ genügt (Dateigröße, Abmessungen, etc.), frage mich aber, wie ich im negativen Fall Flash Bescheid geben kann, dass da etwas schiefgegangen ist.
    Haben wir überhaupt die Möglichkeit, im gleichen Zuge Daten, wie z.B. Statusmeldungen, an Flash zurückzugeben?
    Ich werde es nachher mal mit einem einfachen echo „&statusMSG=alles ok&“ versuchen, aber Flash ist ja nach Aufruf des PHP-Skripts gar nicht auf Response eingestellt, oder?

  2. Hi Christian,

    genau wie Du geschrieben hast, gibt es soweit ich weiß keine Möglichkeit eines direkten Response. Kann sein, dass das in der AS3 Version anders ist – hab ich mich noch nicht mit beschäftigt.

    Ich hab das so gelöst, dass nach der Übertragung ein weiteres PHP-Script aufgerufen wird, welches dann den Job übernimmt.

    Im meinem Fall ging es um eine Verifizierung, ob die Datei auch wirklich gespeichert wurde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.