AS3: упрощение «универсального загрузчика» - PullRequest
2 голосов
/ 09 июля 2009

В сценарии Flash Action 3, когда вам нужно загрузить текст, вы используете класс с именем URLLoader, а когда вам нужно загрузить изображение (или .swf), вы используете класс с именем «Загрузчик». Насколько я знаю, загрузка .bmp с URLLoader так же бесполезна, как загрузка .xml в Loader - она ​​не вычисляется.

Я делаю класс, который обрабатывает очередь внешних ресурсов для загрузки - но кроме разделения целевого URL-адреса для проверки расширения файла, я не могу найти хороший способ определить, требует ли каждый URL-адрес URLLoader или погрузчик. В любом случае, можно представить, что URL-адрес .php может возвращать либо изображение, либо документ - поэтому невозможно рассчитывать на имена файлов, чтобы диктовать правильный тип используемого класса загрузчика.

Есть ли идеи о том, как надежно определить правильный класс для работы на основе URL-адреса?

Ответы [ 3 ]

2 голосов
/ 09 июля 2009

Ну, самый сложный вопрос, это определение типа цели ...

  1. просмотр URL довольно прост, но может не всегда работать ... некоторые люди подают изображения из phps и так далее ...
  2. вы можете сделать это как браузер ... начать загрузку, а затем посмотреть, что это такое ... теперь снова, есть несколько возможностей ...
    1. загрузить данные как двоичные данные ... когда закончите, посмотрите на начальную последовательность ... это PNG (89 50 4E 47 0D 0A 1A 0A)? GIF (47 49 46 38 39 61)? JPEG (FF E0)? SWF ("FWS" (смешно, не правда ли?))? все остальное должно быть основано на тексте или тексте ... в случае изображения загрузите его в Loader с Loader::loadBytes ... будьте осторожны с SWF, хотя ... вы должны загружать только графические SWF-файлы, подобные этим .. в любом другом случае преобразуйте его в строку, используя правильную кодировку (в идеале текстовые данные подаются в utf8) ... тогда, возможно, вы уже можете догадаться, могут ли это быть переменные в кодировке XML, JSON или URL-адреса ... попробуйте парсинг (с использованием классов XML, com.adobe.serialization.JSON, flash.net.URLVariables) ... если все не удается, это, вероятно, просто текст (вы можете попытаться проверить это поверхностно ... если вы хотите что-то добавить по этому поводу, оставьте мне комментарий ) ...
    2. сделайте HTTP сами ... откройте сокет и загрузите источник ... вы получите mime-типы в дополнение ... ничего, на что вы не можете положиться, но это помогает ... есть HTTP реализация в AS3 ... как только у вас есть данные
  3. передать тип вручную ... чисто и просто ... и вы не полагаетесь ни на кого другого ...

есть также важное различие между Loader и URLLoader ... Loader может загружать данные между доменами, просто помещая в песочницу его содержимое, чтобы вы не могли его просматривать ... URLLoader может загружать только из вашего домена, и домены, которые явно разрешают это использование файлов междоменной политики ...

также, загружая SWF-файлы, которые не являются только внешними графическими активами, но вы действительно хотите взаимодействовать, вы не должны использовать это, поскольку вам нужен контроль над LoaderContext и т. Д. ...

итак, да ... какой бы путь вы ни выбрали, удачи ...;)

Greetz

back2dos

1 голос
/ 09 июля 2009

Bulkloader делает какие-то догадки на основе URL, может быть, взглянуть на источник и посмотреть, как они это делают?

0 голосов
/ 09 июля 2009

Лично я бы уточнил, как именно вы хотели бы загрузить свой объект, если это изображение или XML. Поскольку я написал несколько загрузчиков очереди, я предлагаю вам не просто отслеживать строку URL, но и набор объектов с такими вещами, как URL-адрес для загрузки, если он загружен, приоритет загрузки и тип. Вот некоторый псевдокод.

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

Теперь в вашем коде, когда вы хотите добавить что-то в свою очередь.

просто иди

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

// Теперь вставьте это в класс awesome loader, который вы написали и который будет управлять очередью. Я бы отправил объект для загрузки, ссылку на текущую область, например, this, и имя функции, которую вы хотите вызвать, когда этот объект загружен.

MyStaticLodingClass.addQueueObject(loadObject, this, myFunctionThatYouWillCallWhenDone); 

Этот класс выше должен теперь иметь массив, который вы можете отсортировать по приоритету, чтобы дать вам элементы для загрузки, каковы их типы и их URL. Таким образом, вы можете

Это может помочь или нет.

В противном случае сделайте что-нибудь, чтобы выяснить, какой тип объекта вы пытаетесь загрузить, например, BMP, и используйте правильный загрузчик, основываясь на поиске этого объекта.

...