Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 05.05.2012, 00:16
seraphim вне форума Посмотреть профиль Отправить личное сообщение для seraphim Найти все сообщения от seraphim
  № 1  
Ответить с цитированием
seraphim

Регистрация: Apr 2010
Сообщений: 12
По умолчанию Ошибки Loader.loadBytes() при загрузке swf файла после Base64

Привет всем.
Столкнулся с очень странной проблемой, подскажите знающие люди, может кто решал такое:

существует две флешки, одна из них простой загрузчик (прелоадер) в себя основной флешки.
Основную флешку прелоадер получает от php скрипта как ответ на определенный POST запрос в кодированом base64 виде и далее преобразовывает в ByteArray.
После чего загружает при помощи Loader.loadBytes() и добавить на сцену главный класс из загруженной флешки. И вот тут -то и есть главный сюрприз, после попытки либо декодировать из base64 в ByteArray либо при попытке добавления главного класса на сцену выбрасываются разные ошибки.

Вот часть php скрипта, которое отдает закодированный swf файл
PHP код:
echo base64_encode(file_get_contents($url)); 
где $url - это путь к файлу

и часть as3 кода, где происходят ошибки:
Код 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);
		}
где в первом методе data - это ответ от POST запроса к скрипту (строка base64)

ошибки очень разнообразные и зависят как ни странно от того как скомпилировать подгружаемый swf. т.е. даже буквально добавление комментария может вызвать показ другой ошибки.
Основные ошибки такие:
1
ReferenceError: Error #1069: Не удалось найти свойство undefined в __AS3__.vec.Vector.<int>; отсутствует значение по умолчанию.
в классе Base64.as:84 строка
в месте где
Код AS3:
var ba:ByteArray = Base64.decode(str);
2
Предупреждение: файл ActionScript 1.0/2.0 загрузил swf файл ActionScript 3.0, код в файле ActionScript 3.0 выполнятся не будет.
Что само по себе бред, т.к. все флешки скомпилины под as3

3
Предупреждение: Не удалось выполнить анализ поврежденных данных.
Error: Error #2136: SWF-файл http://*/preloader.swf содержит недопустимые данные.

в месте добавления!!! главного класса на сцену, т.е.
Код AS3:
_uiroot.addChild(new mainClass() as DisplayObject);
главный то класс создается! и более того в конструкторе если разместить трейс, то он выполнится, но не более...


среды компиляции: флеш девелоп, SDK 4,5,1
компилил обе флешки под 10.0 до 11.1 эффект один

самое интересное, что если таким образом передать изображение, например jpg и добавить его на сцену, то это произойдет без проблем - php скрипт отдаст в ответе на POST запрос от флешки base64 кодированую картинку и она успешно раскодируется в флешке и загрузится через Loader.loadBytes() и добавится на сцену...


Последний раз редактировалось seraphim; 05.05.2012 в 00:42.
Старый 05.05.2012, 00:29
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 2  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
У Вас это опечатка: onFakeConverted <-> onFakeSwfConverted ?
Если исключить конвертирование в BASE64 и обратно, работает правильно?

Старый 05.05.2012, 00:41
seraphim вне форума Посмотреть профиль Отправить личное сообщение для seraphim Найти все сообщения от seraphim
  № 3  
Ответить с цитированием
seraphim

Регистрация: Apr 2010
Сообщений: 12
Цитата:
Сообщение от zuxul Посмотреть сообщение
У Вас это опечатка: onFakeConverted <-> onFakeSwfConverted ?
Если исключить конвертирование в BASE64 и обратно, работает правильно?
да у меня есть такая опечатка, просто переименовывал уже скопировав сюда, сейчас поправил, в оригинале все одинаково)

если убрать конвертацию в base64 то ответ от php скрипта никак не удается преобразовать в ByteArray, он просто срока и все, даже делая его writeUTFBytes все равно появляется ошибка о поврежденных данных. Самое интересное, что на картинках все работает... может файл swf содержить что-то что не может сконвертировать base64? какие-нибудь нулевые байты?

Добавлено через 18 минут
только что снова проверил, если не кодировать в base64, т.е.
Код AS3:
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);
		}
событие
Код AS3:
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfConverted);
не наступает =(

Старый 05.05.2012, 10:03
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 4  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Цитата:
только что снова проверил, если не кодировать в base64, т.е.
А почему тогда вы данные как строку получаете? Нужно как ByteArray получать и в BINARY формате (а не TEXT). Лишнее преобразование в строку вполне может структуру испортить. Ну и на сервере желательно отдавать контент с Content-Type: application/binary или каким-нибудь другим двоичным форматом.

Цитата:
ReferenceError: Error #1069: Не удалось найти свойство undefined в __AS3__.vec.Vector.<int>; отсутствует значение по умолчанию.
Может быть, ваш Base64 неправильный и глючит. А может, вы данные по дороге к нему портите. Проверьте. Для теста можно строку в код зашить и попробовать распарсить.

Старый 05.05.2012, 10:38
zuxul вне форума Посмотреть профиль Отправить личное сообщение для zuxul Найти все сообщения от zuxul
  № 5  
Ответить с цитированием
zuxul

Регистрация: Dec 2009
Адрес: 59°13′N, 39°54′E
Сообщений: 445
Записей в блоге: 1
Проверьте вот так:
PHP код:
header('Content-Type: application/x-shockwave-flash');
echo 
file_get_contents('file.swf'); 
Код AS3:
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onSwfConverted);
loader.load(new URLRequest("http: путь к php скрипту"), loaderCont);

Старый 05.05.2012, 12:40
seraphim вне форума Посмотреть профиль Отправить личное сообщение для seraphim Найти все сообщения от seraphim
  № 6  
Ответить с цитированием
seraphim

Регистрация: Apr 2010
Сообщений: 12
Всем спасибо за подсказки, решение найдено, необходимо было добавить правильный заголовок в php скрипте:
PHP код:
header('Content-Type: text/plain; charset=ascii');
echo 
base64_encode(file_get_contents($url)); 
код в swf остался неизменным

Старый 05.05.2012, 13:27
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Я бы начал с того, что пообрывал бы руки тому замечательному ПХП-программисту, которому пришло в голову пересылать флешку в Base64 формате. А дальше уже видно было бы, может быть и проблема решилась бы сама по себе.
__________________
Hell is the possibility of sanity

Старый 05.05.2012, 13:40
seraphim вне форума Посмотреть профиль Отправить личное сообщение для seraphim Найти все сообщения от seraphim
  № 8  
Ответить с цитированием
seraphim

Регистрация: Apr 2010
Сообщений: 12
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Я бы начал с того, что пообрывал бы руки тому замечательному ПХП-программисту, которому пришло в голову пересылать флешку в Base64 формате. А дальше уже видно было бы, может быть и проблема решилась бы сама по себе.
на самом деле это сделано для того, чтобы спрятать данные из подгружаемой флешки, чтобы затруднить ее копирование хотя бы на время определенного "эксклюзива". Т.к. данный тип услуги, что будет предоставлять эта флешка много кому нужен, мягко говоря...

кодирование в base64 - это только один из этапов, полный замысел выглядит примерно так:
заходя на сайт на страницу с прелоадером инициируется запись в базе с сессией и сгенеренным для этой сессии открытым ключем. Который попадает в флешку.

Далее флешка для того, чтобы загрузить в себя основную флешку делает POST запросы на сервер с ключем и сессией, сервер сравнивает, не устарела ли сессия и сравнивает ключ. Далее кодирует флешку в base64, затем в строку по ключю и отдает в ответе.

Флешка это все загружает в себя, и разворачивает в обратном порядке, ну и добавляет на сцену.

Понятное дело что все это можно обойти и стырить себе на другой сайт, но все равно решение для этого потребует время))

Старый 05.05.2012, 14:21
maxkar вне форума Посмотреть профиль Отправить личное сообщение для maxkar Найти все сообщения от maxkar
  № 9  
Ответить с цитированием
maxkar

Регистрация: Nov 2010
Сообщений: 497
Вы неправильно предоставляете услугу. Основной код должен быть на сервере, а не во флешке! Стащить серверный код намного сложнее, чем код на клиенте. Чтобы сломать ваше решение "с нуля" потребуется пара-тройка дней. При наличии инструмента и опыта - несколько часов. Алгоритм очень простой. У LoaderInfo есть нехорошее свойство bytes. Значит, флешка где-то хранится в исходном виде. В том числе где-то будут и те байты, которые вы скормили в loadBytes (мало ли, вдруг ваша дочерняя флешка захочет на свои байты посмотреть). Далее дело техники - записываем в файл содержимое процесса (plugin-container), ищем сигнатуру, выполняем проверку корректности SWF, наслаждаемся жизнью. При наличии готовых инструментов все это делается почти автоматически.

Старый 05.05.2012, 17:30
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Цитата:
на самом деле это сделано для того, чтобы спрятать данные из подгружаемой флешки, чтобы затруднить ее копирование хотя бы на время определенного "эксклюзива".
И каким образом Base64 помогает вам в этом? Это не алгоритм шифрования. Этот алгоритм на заре человечества предназначался для того, чтобы пересылать электропочту в таком виде, что ее можно было отобразить на терминале (чтобы не использовать непечатные символы). Этот алгиритм ничего не шифрует, он тривально обратимый к исходной форме без каких либо вообще усилий. Шифр цезаря и то сложнее т.как если принимать байт за символ алфавита, то на расшифровку потребуется 2^8 попыток в худшем случае. На "рaсшифровку" Base64 потребуется одна попытка.
__________________
Hell is the possibility of sanity

Создать новую тему Ответ Часовой пояс GMT +4, время: 12:18.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 12:18.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.