2009-07-09 5 views
2

Dans Flash Action script 3, lorsque vous devez charger du texte, vous utilisez une classe appelée URLLoader, et lorsque vous devez charger une image (ou .swf), vous utilisez une classe appelée ' Chargeur.' Pour autant que je sache, charger un .bmp avec URLLoader est aussi inutile que de charger un .xml dans un Loader - il ne calcule pas.AS3: Rationalisation d'un 'chargeur universel'

Je crée une classe qui gère une file d'actifs externes à charger - mais en dehors de la division de l'URL cible pour vérifier l'extension de fichier, je ne peux pas trouver un bon moyen de dire si chaque URL nécessite un URLLoader ou un chargeur. Quoi qu'il en soit, il est possible qu'une URL .php renvoie une image ou un document. Il est donc impossible de compter sur les noms de fichiers pour dicter le bon type de classe de chargement à utiliser.

Des idées sur la façon de détecter de manière fiable la bonne classe pour le travail, URL par URL?

Répondre

2
bien

, la question la plus délicate, consiste à déterminer le type de la cible ...

  1. regardant l'URL est assez simple, mais peut ne pas toujours ... certaines personnes servent les images de phps et ainsi de suite ...
  2. vous pourriez le faire comme navigateur ... commencer le chargement, puis regarder ce qu'il est ... maintenant encore, il y a de multiples possibilités ...
    1. charge les données sous forme de données binaires ... une fois terminé, regardez la séquence de démarrage ... est-ce PNG (89 50 4E 47 0D 0A 1A 0A)? GIF (47 49 46 38 39 61)? JPEG (FF E0)? SWF ("FWS" (drôle, n'est-ce pas?))? toute autre chose devrait être basée sur le texte ou le texte ... dans le cas d'une image, chargez-la dans un Loader avec Loader::loadBytes ... soyez prudent avec SWF si ... vous ne devriez charger que des fichiers SWF graphiques comme ça ...dans tous les autres cas, convertissez-le en String en utilisant le bon encodage (idéalement, les données textuelles sont servies dans utf8) ... alors peut-être pouvez-vous déjà deviner, qu'il s'agisse de variables XML, JSON ou URL ... essayez d'analyser (en utilisant les classes XML, com.adobe.serialization.JSON, flash.net.URLVariables) ... si tout échoue, c'est probablement du texte (vous pouvez essayer de le vérifier superficiellement ... si vous voulez des commentaires, laissez-moi un commentaire) ...
    2. faites le HTTP vous-même ... ouvrez une socket et chargez la source ... vous obtiendrez des types mime en plus ... rien sur quoi vous pouvez compter, mais ça aide ... il y a un HTTP implementation in AS3 ... une fois que vous avez les données
  3. passer le type manuellement ... pure et simple ... et vous ne comptez sur personne d'autre ...

Il existe également une différence importante entre Loader et URLLoader ... Loader peut charger des données sur plusieurs domaines, simplement en bac à sable pour que vous ne puissiez pas vérifier it ... URLLoader ne peut charger qu'à partir de votre domaine, et des domaines qui autorisent explicitement cela en utilisant des fichiers de politiques inter-domaines ...

également, en chargeant des fichiers SWF, qui ne sont pas seulement des ressources graphiques externes, mais que vous voulez vraiment interfacer avec , vous ne devriez pas utiliser ceci, puisque vous avez besoin de contrôle sur le LoaderContext etc ...

alors, ouais ... peu importe comment vous choisissez, bonne chance ...;)

greetz

back2dos

+0

Merci pour la réponse en profondeur! Je ne connaissais pas l'angle de sécurité du bac à sable, et l'idée de regarder la séquence d'ouverture du fichier est intrigante ... vous pourriez avoir raison, cependant, à la fin, il est plus facile pour moi de leur donner la possibilité de spécifier manuellement le type C'est pour moi d'essayer d'en prendre soin pour eux. –

0

Personnellement, je spécifierais exactement comment vous souhaitez charger votre objet s'il s'agit d'une image ou d'un fichier XML. Depuis que j'ai écrit quelques chargeurs de file d'attente, je suggère que vous ne suiviez pas simplement une chaîne d'URL mais un ensemble d'objets avec des choses comme, l'URL à charger, si elle a chargé, la priorité de chargement et le type. Voici un peu de code psudo.

class QueueObject{ 
    var URLtoLoad:String; 
    private var hasLoaded:Boolean = false; 
    var isDataObject:Boolean = false; 
    var queuePriority:Number = 3; // 
} 

Maintenant dans votre code lorsque vous voulez ajouter quelque chose dans votre file d'attente.

simplement aller

var loadObject:QueueObject = new QueueObject(); 
loadObject.URLtoLoad = "http://theurl.com/somedata.xml"; 
loadObject. isDataObject= true; 

// pousser Maintenant ceci dans la classe super chargeur que vous avez écrit qui va gérer la file d'attente. Je voudrais envoyer l'objet à charger, la référence à la portée actuelle par exemple, ceci, et le nom de la fonction que vous souhaitez appeler lorsque cet objet a été chargé.

MyStaticLodingClass.addQueueObject(loadObject, this, myFunctionThatYouWillCallWhenDone); 

Cette classe doit avoir maintenant au-dessus d'un tableau que vous pouvez trier par ordre de priorité pour vous donner des éléments à charge, ce que leurs types sont et de leur URL. De cette façon vous pouvez

Cela pourrait aider ou non.

D'autre part faire quelque chose pour savoir quel type d'objet vous essayez de charger, par exemple BMP et utiliser le bon chargeur basé sur une recherche pour cet objet.

+0

Ma pensée est plus ou moins dans le même sens - mais je ne suis pas sûr que je veux les faire préciser si la cible est essentiellement du texte ou des données binaires. Et si cette URL cible provient d'une autre source, et qu'elle n'a aucun contrôle sur elle? Ce que je suis vraiment après est de trouver un moyen de détecter automatiquement le type de chargeur approprié. –

1

Bulkloader fait des conjectures sur la base de l'URL, peut-être jeter un coup d'oeil dans la source et voir comment ils le font?

+1

bon lien - semble essayer de détecter automatiquement le type en fonction de l'URL, mais permet à l'utilisateur de transmettre un argument supplémentaire pour contourner ce comportement par défaut. J'aime cette idée. –

+0

Ouais, c'est tout. J'ai joué avec quelques idées sur la détection automatique avant de me contenter de cela. Deviner o url type de fichier est la bonne chose à faire la plupart du temps. Si ce n'est pas le cas, laissez les utilisateurs le remplacer. Essayer de détecter automatiquement le type ajoutera beaucoup de complexité à votre lib ... acclamations –