FileReferenceList - Upload per Button

ali-gator

Erfahrenes Mitglied
Hi,

ich bin seit heute dran mir einen Uploader für Bilddateien zu basteln. An sich ist das find ich gar nicht mal so schwer...allerdings bin ich vorhin auf ein Problem gestoßen wo ich einfach nicht mehr weiterkomme...

Das standart-script für einen File-Uploader geht ja ungefähr so:

PHP:
import flash.net.FileReferenceList;
import flash.net.FileReference;
 
var listener:Object = new Object();
 
listener.onSelect = function(fileRefList:FileReferenceList) {
     trace("onSelect");
     var list:Array = fileRefList.fileList;
     var item:FileReference;
     for(var i:Number = 0; i < list.length; i++) {
          item = list[i];
          trace("name: " + item.name);
          trace(item.addListener(this));
          item.upload("upload.php");
     }
}
 
listener.onCancel = function():Void {
     trace("onCancel");
}
 
listener.onOpen = function(file:FileReference):Void {
     trace("onOpen: " + file.name);
}
 
listener.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
     trace("onProgress with bytesLoaded: " + bytesLoaded + " bytesTotal: " + bytesTotal);
}
 
listener.onComplete = function(file:FileReference):Void {
     trace("onComplete: " + file.name);
}
 
listener.onHTTPError = function(file:FileReference, httpError:Number):Void {
     trace("onHTTPError: " + file.name + " httpError: " + httpError);
}
 
listener.onIOError = function(file:FileReference):Void {
     trace("onIOError: " + file.name);
}
 
listener.onSecurityError = function(file:FileReference, errorString:String):Void {
     trace("onSecurityError: " + file.name + " errorString: " + errorString);
}
 
var fileRef:FileReferenceList = new FileReferenceList();
fileRef.addListener(listener);
fileRef.browse();

Allerdings werden hier die Files direkt hochgeladen wenn man in der Dialogbox auf "ok" geklickt hat. Ich will allerdings, dass man später erst noch die Files in einer Liste stehen hat und evtl. noch eins rausnehmen kann bevor man es hochlädt, sprich die Dateien sollen erst hochgeladen werden wenn man auf einen Button klickt...
Ich bin zwar schon soweit gekommen, dass die Files hochgeladen werden, habs aber nicht geschafft dass dann die ganzen überwachungsfunktionen (onOpen, on Progress) usw auch weiterhin funktionieren...ich weiß nicht wo da der Fehler liegt.... Kann mir da jemand mal ein bisschen was zu erklären, bzw. ein kleines Beispiel posten? Wär spitze :) bis dann, ali-gator
 
Hi,

auf die Schnelle müsste das ungefähr so aussehen:
Code:
import flash.net.FileReferenceList;
import flash.net.FileReference;
 
var l1:Object = new Object(); // Für die Listen
var l2:Object = new Object(); // für die einzelnen Dateien
var l3:Object = new Object(); // für die Listenkomponente

l3.change = function(eo:Object) {
	purgeItem(eo.target.selectedIndex);
}

display.addEventListener("change", l3);
 
l1.onSelect = function(fileRefList:FileReferenceList) {
     var list:Array = fileRefList.fileList;
     for(var i:Number = 0; i < list.length; i++) {
          finList.fileList.push(list[i]);
    }
	updateList(finList.fileList);
}
 
l1.onCancel = function():Void {
     trace("onCancel");
}
 
l2.onOpen = function(file:FileReference):Void {
     trace("onOpen: " + file.name);
}
 
l2.onProgress = function(file:FileReference, bytesLoaded:Number, bytesTotal:Number):Void {
     trace("onProgress with bytesLoaded: " + bytesLoaded + " bytesTotal: " + bytesTotal);
}
 
l2.onComplete = function(file:FileReference):Void {
     trace("onComplete: " + file.name);
}
 
l2.onHTTPError = function(file:FileReference, httpError:Number):Void {
     trace("onHTTPError: " + file.name + " httpError: " + httpError);
}
 
l2.onIOError = function(file:FileReference):Void {
     trace("onIOError: " + file.name);
}
 
listener.onSecurityError = function(file:FileReference, errorString:String):Void {
     trace("onSecurityError: " + file.name + " errorString: " + errorString);
}
 
var fileRef:FileReferenceList = new FileReferenceList();

fileRef.addListener(l1);

var finList:FileReferenceList = new FileReferenceList();

button.onRelease = function() {
	fileRef.browse();
}

button2.onRelease = function() {
	var fl:Array = finList.fileList;
	for (var i=0; i<fl.length; i++) {
		var ref:FileReference = fl[i];
		ref.addListener(l2);
		trace("Hochladen: " + ref.name);
		ref.upload("upload.php");
	}
}

function updateList(fl:Array) {
	display.removeAll();
	for (var i=0; i<fl.length; i++) {
		display.addItem(fl[i].name, i);
	}
}

function purgeItem(idx:Number) {
	finList.fileList.splice(idx, 1);
	updateList(finList.fileList);
}
"button" und "button2" sind einfach zwei MovieClips (einer zum Durchsuchen und einer zum Hochladen); "display" ist in diesem Beispiel eine List-Komponente auf der Bühne.

Wird eine (oder mehrere) Datei(en) ausgewählt, so werden sie der vorläufig endgültigen Liste "finList" zugefügt und die Listenkomponente wird aktualisiert. Klickst Du in der Liste auf einen Eintrag, so wird dieser entfernt.

Wird auf den zweiten Button geklickt, so werden alle Dateien in "finList" hochgeladen.

Gruß
.
 
Hey, sehr cool, habs mir grad mal angeschaut und das ist genau das was ich wissen wollte. Werd mir morgen mal das Script genau ansehen und mal schauen was ich falsch gemacht habe... Danke für die superschnelle Antwort!
bis dann

ali-gator
 
Hallo,
ich möchte diesen Thread nocheinmal aufgreifen, da hier leider keine Antwort mehr kam.
Ich denke mal ich bin zu blöd bzw. habe Flash nicht verstanden(ein Wunder wenn ich es würde).
Spaß bei Seite.... ich habe das skript mal ausprobiert alles geht bis auf den eigentlichen Upload :S
Weiß einer von den Flashexperten hier im Forum wo der Fehler liegt? =)
Am Skript oder mir? :D
display, button und button2 habe ich erstellt....
lG
Chris
 
Hast du ein entsprechendes Upload-Script? Sind die Dateiberechtigungen für den Zielordner korrekt gesetzt? Zeig am besten mal deine fla und die php her.
Gruß
 
Danke für die Antwort =)
Also das ganze läuft lokal und entsprechende Berechtigungen (sollten) gesetzt sein =)
Die fla ist die selbe wie oben(Post von Tobias), da ich es mal ausprobieren wollte und die upload.php schaut wie folgt aus:
PHP:
	$uploadDirectory="uploads/";
	$uploadFile=$uploadDirectory.basename($_FILES['Filedata']['name']);

	copy($_FILES['Filedata']['tmp_name'], $uploadFile);
Das ganze ist nur ein Probelauf das Skript wird später noch entsprechend erweitert...
Es sollte eigentlich funktionieren, da es mit anderen Skripten in Kombination läuft.

Grüße
Chris
 
Es sollte eigentlich funktionieren, da es mit anderen Skripten in Kombination läuft.

Mit was für Scripten in was für einer Kombination?

Dir ist klar, dass man fürs lokale Ausführen von PHP zumindest einen virtuellen Webserver wie XAMPP braucht?
 
ja das ist mir klar xD und der läuft auch schon seit längerm =)
sorry, dass war ein bissel falsch ausgedrückt. Ich meinte ein normales HTML Formular zum Beispiel....
Dort kann ich ohne Probleme hochladen.
So wie ich es verstanden habe wird doch jedes mal wenn Flash eine Datei hochlädt das uploadskript ausgeführt.
Das müsste doch auch für einen Upload mit mehrern Bildern der Fall sein:
Datei 1 hochladen uploadskript ausführen
Datei2 hochladen uploadskript erneut ausführen
oder muss ich das Skript mit einer schönen Schleife dekorieren?

Grüße
Chris
 
Naja - wenn du Daten an das Script schickst, bevor alle Daten hochgeladen sind, kann es zu gehörigen Fehlern kommen. Ich würde abfangen, ob die Datenübertragung erfolgreich war - die FileReference-Klasse feuert da bestimmt ein entsprechendes Event, und dann erst die nächste Datei hochladen.
 

Neue Beiträge

Zurück