Frage

In Ordnung, zur Zeit habe ich meine SWF eine PHP-Datei trifft, die alle Dateien gehen und finde ich es angeben, fügen Sie ihre Größen zusammen und kehren ihre kombinierten Größen als eine Nummer. Ich habe dann verwenden Sie diese Nummer mit einem Progress Hörer des aktuellen Prozentsatz der Dateien zu bestimmen, für diesen speziellen Bereich der Website heruntergeladen werden.

Ziemlich einfach nicht wahr? Nun jetzt mit, dass die PHP-Datei nicht in Frage, und ich bin versucht, alles, was in der SWF zu tun, anstatt sie zu haben traf ein außerhalb Skript, um die Zahlen zu bekommen was ich brauche.

Gibt es eine gute Möglichkeit, eine Datei der Größe zu bekommen, bevor ich es in der Flash-Laden zu starten? Ich brauche die preloader wirklich ein 0 bis 100% preloader sein, damit ich die Gesamtzahl der Bytes benötigen werde ich das Herunterladen werden, bevor es tatsächlich beginnt.

Ein Gedanke, den ich hatte, war nur das Array durchzugehen und die Datei-URLs zu halten, beginnen sie zu laden, getTotalBytes ohne jede Belastung anzeigt, töten die Last auf dem ersten Tick, summieren sich alle diese insgesamt Bytes Zahlen, und starten Sie dann die eigentliche Download-Prozess. Diese Methode scheint sehr hässlich, und es wird der Benutzer einen Pre-Loader es wahrscheinlich ein oder zwei Sekunden durch alle Dateien ausführen nehmen auf dem Gelände trifft eine große Zeit Abfall wie jedes Mal sein, deren Gesamt finden und dann den Download wirklich starten.

Gibt es eine bessere Lösung für dieses Problem ohne außerhalb von Flash geht die Größe der Dateien zu bekommen?

War es hilfreich?

Lösung

Sie können eine HTTP-HEAD-Anfrage an den Server für die Dateien tun. Dadurch wird die Header Informationen (einschließlich der Dateigröße) zurück, aber nicht die eigentlichen Datei. Sie könnten dann eine GET-Anfrage machen die Dateien zu laden.

http://www.w3.org/Protocols/rfc2616/rfc2616 -sec9.html

(Lesen Sie Kapitel 9.4 HEAD)

Was würde ich wohl tun, ist ein zweistufigen Fortschrittsbalken (mit 2 Fortschrittsbalken). Eine zeigt insgesamt Fortschritte (0 bis 100%) und eine Vorführung pro Datei Fortschritt (wie jede Datei heruntergeladen wird).

Auf diese Weise, solange Sie die Anzahl der Dateien zu laden kennen, können Sie den gesamten Fortschritt tun, ohne zuerst den Server zu treffen, die die Dateigrößen zu erhalten.

mike Kammern

mesh@adobe.com

Andere Tipps

Mike Kammer Idee wird Ihnen helfen, aber es wird immer noch langsamer als etwas server verwenden, da Sie sowieso für jede Datei eine Anfrage machen müssen werde. Es ist im Wesentlichen das gleiche, was du selbst sagst, aber wenn man explizit sind für die Header gefragt wird es etwas schneller sein. Verwenden Sie eine Steckdose, die Anforderung zu tun:

var socket : Socket = new Socket( );
socket.addEventListener( Event.CONNECT, connectHandler );
socket.addEventListener( ProgressEvent.SOCKET_DATA, dataHandler );
socket.connect( "yourserver.com", 80 );

function connectHandler( event : Event ) : void {
    var headers : String = "HEAD yourfilename.ext http/1.1\r\n";
    headers += "Host: yourserver.com\r\n";
    headers += "\r\n\r\n";
    socket.writeUTFBytes( headers );
    socket.flush( );
}

function dataHandler( event : ProgressEvent ) : void {
    trace( "Received headers\n" );
    trace( socket.readUTF( socket.bytesAvailable ) );
}

Wenn es unbedingt notwendig ist, zu steuern, wie die Dateien geladen werden, dann glaube ich, Mike Chambers' Vorschlag eine HTTP HEAD-Anforderung zu machen, ist der Weg zu gehen.

Allerdings sei denn, es gibt einen guten Grund, nicht zu, würde ich einfach beginnen sofort alle Dateien geladen und meine Dateigrößen erhalten von jedem getBytesTotal Methode der Datei. Da Flash-seinen Netzwerk-Stack aus dem Browser wird, wird entspricht die Anzahl der Dateien tatsächlich gleichzeitig geladen zu den (benutzerdefinierbare) Browser-Einstellungen.

Im Folgenden ist nur zu Beispielzwecken. In einem realen Fall, dass ich Timer verwenden würde nicht, würde ich ein Array oder XML-Objekt hat mit einem zu durchlaufen for-Schleife, und zwar unabhängig es funktioniert großartig und im Grunde, wenn Sie das Ende Ihrer Schleife getroffen (zB if (i == (Länge - 1 )) hat es die Funktionalität nennen, die die tatsächlichen Vorbelastungs jetzt beginnt, dass wir unsere Gesamt haben. jetzt wiederholen wir durch das Array oder XML-Objekt wieder, aber diesmal machen wir es nur einmal jedes Asset geladen ist, nicht in einem for-Schleife . Diese asynchrone Verfahren kann dann dort sitzen und vergleichen, wie viele Daten es und Kluft, die durch die früher gefunden insgesamt geben Sie Ihre Prozentsatz geladen ist.

var totalBytes:Number = 0;

var loader:Loader = new Loader();
var request:URLRequest = new URLRequest();
request.url = 'badfish.jpg';

var timer:Timer = new Timer(200);
timer.addEventListener(TimerEvent.TIMER, onTimer);

function onTimer(e:TimerEvent)
{
    loader.load(request);
    loader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onProgress);
}
function onProgress(e:ProgressEvent):void
{
    totalBytes+=e.bytesTotal;
    trace(e.bytesTotal,totalBytes);
    loader.contentLoaderInfo.removeEventListener(ProgressEvent.PROGRESS, onProgress);
}

timer.start();
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top