Передача байтового массива ActionScript JPG в Javascript (и в конечном итоге в PHP) - PullRequest
0 голосов
/ 19 мая 2010

В нашем веб-приложении есть функция, которая использует Flash (AS3) для фотографирования с помощью веб-камеры пользователя, а затем передает полученный байтовый массив в PHP, где он восстанавливается и сохраняется на сервере.

Однако нам нужно отключить это веб-приложение, и мы выбрали для этого Gears. Пользователь переводит приложение в автономный режим, выполняет свои задачи, затем, когда он снова подключается к серверу, мы «синхронизируем» данные с нашей центральной базой данных.

У нас больше нет PHP для взаимодействия с Flash, но нам все еще нужно разрешить пользователям делать и сохранять фотографии. Мы не знаем, как сохранить JPG, который Flash создает в локальной базе данных. Мы надеялись, что мы сможем сохранить байтовый массив, сериализованную строку или как-то фактически сохранить сам объект, а затем передать его обратно либо в PHP, либо во Flash (а затем в PHP), чтобы воссоздать JPG.

Мы попробовали: - передача байтового массива в Javascript вместо PHP, но javascript, похоже, ничего не может с этим сделать (объект, похоже, лишен своих методов) - приведение в порядок байтового массива во Flash, а затем передача его в Javascript, но мы всегда получаем одну и ту же строку:

ÿØÿà

Теперь мы думаем о сериализации строки во Flash, передаче ее в Javascript, а затем об обратном маршруте, передаче этой строки обратно во Flash, которая затем передаст ее в PHP для восстановления в формате JPG. (Гмм). Так как никто в нашей команде не имеет обширного фона Flash, мы немного растеряны.

Сериализация - это путь? Есть ли более реалистичный способ сделать это? У кого-нибудь есть опыт с подобными вещами? Возможно, мы можем создать класс javascript, который совпадает с классом байтового массива в AS?

1 Ответ

2 голосов
/ 19 мая 2010

Я не уверен, почему вы хотите использовать Javascript здесь. В любом случае вставленная вами строка выглядит как начало заголовка JPG. Проблема в том, что JPG наверняка будет содержать NUL (символы с 0 в качестве значения). Скорее всего, это приведет к обрезанию строки (как, по-видимому, и в примере, который вы разместили). Если вы хотите «структурировать» JPG, стандартный подход кодирует его как Base 64.

Однако, если вы хотите сохранить данные локально, есть способ сделать это во Flash. Это просто, но у него есть некоторые ограничения.

Для этого вы можете использовать локальный Общий объект . По умолчанию существует ограничение в 100 Кб, что недостаточно для файлов изображений; Вы можете попросить пользователя выделить больше места для вашего приложения. В любом случае я бы попытался сохранить изображение в формате JPG, а не в виде необработанных пикселей, поскольку разница в размерах очень существенна.

Shared Objects будет прозрачно обрабатывать сериализацию / десериализацию для вас. Есть некоторые предостережения: не каждый объект действительно может быть сериализован; для начала у него должен быть конструктор без параметров; Объекты DisplayOb, такие как спрайты, фрагменты ролика и т. Д., Не будут работать. Однако можно сериализовать ByteArray, чтобы вы могли сохранять файлы JPG локально (если пользователь допускает дополнительное пространство). Вы должны использовать AMF3 в качестве схемы кодирования (я думаю, что она используется по умолчанию); также вы должны сопоставить класс, который вы сериализуете, с registerClassAlias ​​, чтобы сохранить тип сериализованного объекта (иначе он будет рассматриваться как объект Object). Вам нужно сделать это только один раз в жизненном цикле приложения, но это нужно сделать перед любым чтением / записью в Shared Object.

Что-то вроде:

registerClassAlias ​​( "flash.utils.ByteArray", ByteArray);

Я бы использовал Shared Objects, а не Javascript. Просто имейте в виду, что вам, скорее всего, придется попросить пользователя предоставить вам больше места для хранения изображений (что кажется достаточно разумным, если вы позволяете им работать в автономном режиме), и что пользователь может удалить данные в любое время. время (точно так же, как он мог удалить куки своего браузера).

Редактировать

Я понимаю, что на самом деле я не обращал особого внимания на то, что "мы выбрали Gears для этого", часть вашего вопроса.

В этом случае вы могли бы попробовать использовать метод base 64 для передачи данных в JS. Со стороны Actionscript это просто (возьмите один из множества доступных кодеров / декодеров Base64), и я предполагаю, что в API Gear уже должен быть доступен кодер / декодер (или, по крайней мере, его не должно быть трудно найти). В этот момент вам, вероятно, придется превратить это в BLOB-объект и сохранить его на диске (возможно, используя BlobAPI , но я не уверен, поскольку у меня нет опыта работы с Gears).

...