Flash Bilder in Schleife downloaden

Tipp-ex

Cadet 3rd Year
Registriert
Okt. 2008
Beiträge
55
Hallo zusammen,

folgendes:
Ich habe verschiedene URLs von denen ich die Bilder downloaden möchte, das ganze läuft in einer Schleife ab wo jedesmal ein neuer lLoader definiert wird und auch ein EventListener der beobachtet ob das Bild fertig geladen ist. Jedoch habe ich nun folgendes Problem, denn ich bekomme immer nur das letzte Bild angezeigt respektiv nur die ID des Bildes.

Meine Funktion für den Bilderdownload:

Code:
		public function searchImgTag() : void
		{
			var myPattern:RegExp = /<img src=".*?"/ig;
			var result:String = myPattern.exec(strHTML);
			var i:int = 0;

			while (result != null) 
			{				
				this.tmpURL = result.substring(result.indexOf("src")+5,result.length-1);
				
				this.tmpImgID = "img_"+i;
				
				//Falls TRUE so werden die Links in einem Array gespeichert
				if (checkImage(this.tmpURL) == true)
				{
					loader = new Loader();
					loader.load(new URLRequest(this.tmpURL));
					loader.contentLoaderInfo.addEventListener(Event.COMPLETE, addToimgArray);

					i++;
				}
				
				result = myPattern.exec(strHTML);
			}
		}

Meine Funktion für den Listener falls da Bild geladen wurde:
Code:
		public function addToimgArray(event:Event) : void
		{
			imgArray.push({imageID : this.tmpImgID, imageURL : this.tmpURL, image : loader});
		}
Ich hoffe das Ihr mein Problem nachvollziehen könnt und mein Problem versteht.

mfg
Tipp-ex
 
Ich kenne ActionScript nicht, aber wenn ich das richtig lese kann das nur falsch sein denn du überschreibst bei jedem Schleifendurchlauf tmpURL, tmpImgID und (ist das auch eine Membervariable?) loader - wenn dann das 1. Asynchrone Event passiert (sprich fertig geladen) - dann hat es mit sehr sehr hoher Wahrscheinlichkeit die Werte des letzten Schleifendurchgangs.

Was du brauchst ist soetwas in der Art (ob es wirklich genau so ist kann ich dir jetzt nicht sagen - wie gesagt keine ActionScript Kenntnisse).

Code:
public function searchImgTag() : void {
    var myPattern:RegExp = /<img src=".*?"/ig;
    var result:String = myPattern.exec(strHTML);
    var i:int = 0;
    while (result != null) {
        var url:String = result.substring(result.indexOf("src")+5,result.length-1);
        //Falls TRUE so werden die Links in einem Array gespeichert
        if (checkImage(url) == true) {
            var imgId= "img_"+i;
            loader = new Loader();
            loader.load(new URLRequest(url));
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, buildAddToImgArray(imgId, url, loader));
            i++;
        }
        result = myPattern.exec(strHTML);
    }
}
function buildAddToImgArray(imageID:String, imageUrl:String, loader:Loader):Function {
    return function(event:Event):void {
        imgArray.push({imageID : imageID, imageUrl:ImageUrl, loader:loader});
    };
}

lg, Heli
 
Für den Download mehrere Files empfehle ich den BulkLoader. Einfach die SWC runter laden und ins Projekt einfügen.

Dieser Loader kann mehrere Dateien auf einmal laden. Dazu habe ich deinen Code etwas angepasst. Wie der Vorposter schon sagte dürfen sowohl die URL als auch die ID keine Membervariablen sein sondern müssen nur lokal deklariert werden. Stattdessem brauchen wir ein Array (als Member) um die IDs zu speichern. Diese dienen später zum Abruf der runtergeladenen Daten.

Das sieht erstmal ziemlich viel aus was an am Error -und Progresshandler liegt. Diese sind nicht zwingend notwendig aber empfohlen. Wichtig für dich sind in erster Linie die while Schleife und der Completehandler.
Hier nun dein Code mit BulkLoader
Code:
public function searchImgTag() : void
{
	var myPattern:RegExp = /<img src=".*?"/ig;
	var result:String = myPattern.exec(strHTML);
	var i:int = 0;

	loader = new BulkLoader();			
	loader.logLevel = BulkLoader.LOG_INFO;
	loader.addEventListener(BulkLoader.ERROR, handlerDownloaderError);
	loader.addEventListener(BulkLoader.SECURITY_ERROR, handlerDownloaderError);
	loader.addEventListener(BulkLoader.PROGRESS, handlerDownloaderProgress);
	loader.addEventListener(BulkLoader.COMPLETE, handlerLoadConfigComplete);

	
	while (result != null)
	{	
		var tmpURL:String = result.substring(result.indexOf("src")+5,result.length-1);
		var tmpImgID:String = "img_"+i;
		//Falls TRUE so werden die Links in einem Array gespeichert
		if (checkImage(tmpURL) == true)
		{
			// wir pushen die ids in ein array damit wir die daten im 
			// completehandler mit dieser id abrufen können
			this.ids.push(tmpImgID);
			// wir fürgen die herunterzuladende URL hinzu.			
			// Die ID wird in ein Objekt gepackt und als property an die add methode übergeben
			loader.add(tmpURL, {id:tmpImgID});				
			i++;
		}
		result = myPattern.exec(strHTML);
	}	
	// wir starten den ladevorgang nachdem alle images hinzugefügt wurden
	loader.start();
}

/**
* Der Handler wird aufgerufen sobald alle Bilder geladen wurde
*/
protected function handlerLoadFilesComplete(event:Event):void
{
	// wir iterieren durch die ids
	for(var i:int = 0; i < this.ids.length; i++) {				
		// abruf der daten für jede id. das ist möglich weil wir in der searchImgTag-Funktion 
		// die id als eigenschaft an den loader übergeben haben
		var img:ByteArray = loader.getByteArray(this.ids[i]);		
	}	
}
		

/**
* Niemals den Error handler vergessen
*/
protected function handlerDownloaderError(event:ErrorEvent):void
{				
	loader.log(event.text);
}

/**
* Zeigt den Fortschritt im traceTarget an
*/
protected function handlerDownloaderProgress(event:BulkProgressEvent):void
{			
	loader.log(event.loadingStatus());
}

Ich hoffe das ist halbwegs verständlich. Bei Fragen frag halt.
 
Zurück
Oben