Question

Très bien, mon fichier SWF frappe actuellement un fichier php qui va chercher tous les fichiers que je lui spécifie, ajouter leurs tailles ensemble et renvoyer leurs tailles combinées sous la forme d’un nombre. J'utilise ensuite ce numéro avec un auditeur ProgressEvent pour déterminer le pourcentage actuel de téléchargement de fichiers pour cette section particulière du site Web.

Assez simple non? Il est hors de question d’utiliser ce fichier PHP et j’essaie de tout faire à l’intérieur du fichier SWF au lieu de le placer dans un script externe pour obtenir les chiffres dont j'ai besoin.

Existe-t-il un bon moyen d'obtenir la taille d'un fichier AVANT de commencer à le charger dans Flash? J'ai vraiment besoin que le préchargeur soit de 0 à 100%, donc j'ai besoin du nombre total d'octets que je téléchargerai avant qu'il ne commence réellement.

L’une de mes pensées était de parcourir le tableau contenant les URL de fichier, de commencer à les charger, d’obtenir GetTotalBytes sans afficher de chargement, de supprimer la charge au premier tick, d’additionner le nombre total d’octets, puis de lancer le processus de téléchargement. Cette méthode semble très laide et entraînera une perte de temps considérable, car chaque fois que l'utilisateur clique sur un pré-chargeur sur le site, il faudra probablement une seconde ou deux pour parcourir tous les fichiers, trouver leur total et commencer à télécharger.

Existe-t-il une meilleure solution à ce problème sans sortir de la mémoire flash pour obtenir la taille de ces fichiers?

Était-ce utile?

La solution

Vous pouvez envoyer une requête HTTP HEAD au serveur pour les fichiers. Cela renverra les informations d'en-tête (y compris la taille du fichier) mais pas le fichier réel. Vous pouvez ensuite faire une requête GET pour charger les fichiers.

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

(Consultez la section 9.4 HEAD)

Ce que je ferais probablement, c’est une barre de progression à deux niveaux (avec deux barres de progression). Une indiquant la progression globale (0 à 100%) et une indiquant la progression par fichier (chaque fichier étant téléchargé).

Ainsi, tant que vous connaissez le nombre de fichiers à charger, vous pouvez faire le progrès total sans devoir au préalable frapper le serveur pour obtenir la taille du fichier.

chambres de micro

mesh@adobe.com

Autres conseils

L’idée de Mike Chamber vous aidera, mais elle sera tout de même plus lente que d’utiliser quelque chose au niveau serveur, car vous devrez quand même faire une demande pour chaque fichier. C'est essentiellement la même chose que ce que vous dites vous-même, mais si vous demandez explicitement les en-têtes, cela sera légèrement plus rapide. Utilisez un socket pour faire la requête:

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 ) );
}

S'il est absolument nécessaire de contrôler le mode de chargement des fichiers, je pense que la suggestion de Mike Chambers de faire une requête HTTP HEAD est la solution.

Cependant, à moins d'une bonne raison de ne pas le faire, je commencerais simplement à charger tous les fichiers en même temps et à obtenir la taille de mes fichiers à l'aide de la méthode getBytesTotal de chaque fichier. Étant donné que Flash récupère sa pile réseau à partir du navigateur, le nombre de fichiers effectivement chargés simultanément sera conforme aux paramètres du navigateur (définissables par l'utilisateur).

Ce qui suit est juste à titre d'exemple. Dans un cas réel, je n’utiliserais pas Timer, j’aurais un tableau ou un objet XML à parcourir avec une boucle for, bien que cela fonctionne très bien et qu’une fois que vous avez atteint la fin de votre boucle (par exemple, if (i == (longueur - 1 )) l’appelle la fonctionnalité qui lance le pré-chargement proprement dit maintenant que nous avons notre total. Maintenant, nous parcourons à nouveau le tableau ou l’objet XML, mais cette fois-ci, nous ne le faisons qu’une fois que chaque actif a été chargé, et non dans une boucle for Cette méthode asynchrone peut alors rester là et comparer la quantité de données qu’elle a chargée et la diviser par le total précédemment trouvé, ce qui vous donne votre pourcentage.

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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top