![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 12
|
Привет всем.
Столкнулся с очень странной проблемой, подскажите знающие люди, может кто решал такое: существует две флешки, одна из них простой загрузчик (прелоадер) в себя основной флешки. Основную флешку прелоадер получает от php скрипта как ответ на определенный POST запрос в кодированом base64 виде и далее преобразовывает в ByteArray. После чего загружает при помощи Loader.loadBytes() и добавить на сцену главный класс из загруженной флешки. И вот тут -то и есть главный сюрприз, после попытки либо декодировать из base64 в ByteArray либо при попытке добавления главного класса на сцену выбрасываются разные ошибки. Вот часть php скрипта, которое отдает закодированный swf файл где $url - это путь к файлу и часть as3 кода, где происходят ошибки: static private function onSwf(data:Object):void { var str:String = data as String; var ba:ByteArray = Base64.decode(str); var loaderCont:LoaderContext = new LoaderContext(); loaderCont.applicationDomain = ApplicationDomain.currentDomain; loaderCont.allowCodeImport = true; loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfConverted); loader.loadBytes(ba, loaderCont); } static private function onSwfConverted(e:Event):void { var mainClass:Class = e.target.applicationDomain.getDefinition("PreloaderMain") as Class; _uiroot.addChild(new mainClass() as DisplayObject); } ошибки очень разнообразные и зависят как ни странно от того как скомпилировать подгружаемый swf. т.е. даже буквально добавление комментария может вызвать показ другой ошибки. Основные ошибки такие: 1 ReferenceError: Error #1069: Не удалось найти свойство undefined в __AS3__.vec.Vector.<int>; отсутствует значение по умолчанию. в классе Base64.as:84 строка в месте где 2 Предупреждение: файл ActionScript 1.0/2.0 загрузил swf файл ActionScript 3.0, код в файле ActionScript 3.0 выполнятся не будет. Что само по себе бред, т.к. все флешки скомпилины под as3 3 Предупреждение: Не удалось выполнить анализ поврежденных данных. Error: Error #2136: SWF-файл http://*/preloader.swf содержит недопустимые данные. в месте добавления!!! главного класса на сцену, т.е. главный то класс создается! и более того в конструкторе если разместить трейс, то он выполнится, но не более... среды компиляции: флеш девелоп, SDK 4,5,1 компилил обе флешки под 10.0 до 11.1 эффект один самое интересное, что если таким образом передать изображение, например jpg и добавить его на сцену, то это произойдет без проблем - php скрипт отдаст в ответе на POST запрос от флешки base64 кодированую картинку и она успешно раскодируется в флешке и загрузится через Loader.loadBytes() и добавится на сцену... Последний раз редактировалось seraphim; 05.05.2012 в 00:42. |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 12
|
Цитата:
если убрать конвертацию в base64 то ответ от php скрипта никак не удается преобразовать в ByteArray, он просто срока и все, даже делая его writeUTFBytes все равно появляется ошибка о поврежденных данных. Самое интересное, что на картинках все работает... может файл swf содержить что-то что не может сконвертировать base64? какие-нибудь нулевые байты? Добавлено через 18 минут только что снова проверил, если не кодировать в base64, т.е. static private function onSwf(data:Object):void { var str:String = data as String; var ba:ByteArray = new ByteArray(); ba.writeUTFBytes(str); var loaderCont:LoaderContext = new LoaderContext(); loaderCont.applicationDomain = ApplicationDomain.currentDomain; loaderCont.allowCodeImport = true; loader = new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfConverted); loader.loadBytes(ba, loaderCont); } |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Цитата:
Цитата:
|
|
|||||
|
Проверьте вот так:
|
|
|||||
|
Регистрация: Apr 2010
Сообщений: 12
|
Всем спасибо за подсказки, решение найдено, необходимо было добавить правильный заголовок в php скрипте:
код в swf остался неизменным |
|
|||||
|
Modus ponens
|
Я бы начал с того, что пообрывал бы руки тому замечательному ПХП-программисту, которому пришло в голову пересылать флешку в Base64 формате. А дальше уже видно было бы, может быть и проблема решилась бы сама по себе.
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Apr 2010
Сообщений: 12
|
Цитата:
кодирование в base64 - это только один из этапов, полный замысел выглядит примерно так: заходя на сайт на страницу с прелоадером инициируется запись в базе с сессией и сгенеренным для этой сессии открытым ключем. Который попадает в флешку. Далее флешка для того, чтобы загрузить в себя основную флешку делает POST запросы на сервер с ключем и сессией, сервер сравнивает, не устарела ли сессия и сравнивает ключ. Далее кодирует флешку в base64, затем в строку по ключю и отдает в ответе. Флешка это все загружает в себя, и разворачивает в обратном порядке, ну и добавляет на сцену. Понятное дело что все это можно обойти и стырить себе на другой сайт, но все равно решение для этого потребует время)) |
|
|||||
|
Регистрация: Nov 2010
Сообщений: 497
|
Вы неправильно предоставляете услугу. Основной код должен быть на сервере, а не во флешке! Стащить серверный код намного сложнее, чем код на клиенте. Чтобы сломать ваше решение "с нуля" потребуется пара-тройка дней. При наличии инструмента и опыта - несколько часов. Алгоритм очень простой. У LoaderInfo есть нехорошее свойство bytes. Значит, флешка где-то хранится в исходном виде. В том числе где-то будут и те байты, которые вы скормили в loadBytes (мало ли, вдруг ваша дочерняя флешка захочет на свои байты посмотреть). Далее дело техники - записываем в файл содержимое процесса (plugin-container), ищем сигнатуру, выполняем проверку корректности SWF, наслаждаемся жизнью. При наличии готовых инструментов все это делается почти автоматически.
|
|
|||||
|
Modus ponens
|
Цитата:
__________________
Hell is the possibility of sanity |
![]() |
![]() |
Часовой пояс GMT +4, время: 05:58. |
|
|
« Предыдущая тема | Следующая тема » |
|
|