PDA

Просмотр полной версии : AS3 ByteArray -> AMF -> MongoDB


AlexCooper
30.09.2013, 14:55
Здравствуйте.
Столкнулся с небольшой проблемой, хочу в базу (Mongo) записать байтарей и потом обратно вытянуть. Но что-то видимо не дочитал. Есть ли опыт у кого-то в подобном?
front-end
var lic:Object = new Object();
lic.emei = emei.text;
lic.sign = MD5.hash(emei.text);
lic.desc = desc.text;

var ba:ByteArray = new ByteArray();
ba.writeObject(lic);
ba.compress();

var send:Object = new Object();
send.lic = lic;
send.ba = ba;

AMF.call('User/licHandler', callbackHandler, send);
back-end
public function licHandler($data) {

$data = Security::check($data);

// http://chimala.wordpress.com/2007/07/31/flex-20-sending-bytearray-to-amfphp/
$data['ba'] = new MongoBinData($data['ba']->data);

// пробовал и new MongoBinData($data['ba']) тогда вообще пусто

Security::mdb('licence')->insert($data);

return config::responser($data);
}
Всё на первый взгляд работает, но при получении обратно ByteArray
public function getLicenceList($data) {
Security::check($data);

return config::responser(Security::mdb('licence')->find());
}

private function licenceHandler(data:Object):void {
trace(data);


var byteArray:ByteArray = data['52494f9c8bbf0eb0b8bd9c0d']['ba']['bin'];
byteArray.uncompress();

var obj:Object = byteArray.readObject();

for ( var i in obj) {
trace(i+" >> "+obj[i]);
}

}
ловлю
TypeError: Error #1034: Type Coercion failed: cannot convert "xÚãâfäLI-Nfc762äLÍMÍdc742æ,ÎLÏcs420JN²43JL6µ4072M’ Ì
MRŒŒM’Ì
Çɤ" to flash.utils.ByteArray.
Соответственно где-то я не дочитал.
Подскажите где может быть проблема. Может вытянув из MongoDB нужно "пересобрать" из BinData в ByteArray...

Tails
30.09.2013, 15:12
В базе данных в столбце сохранения какой тип данных указан? Строка наверное? Вы же байты сохраняете, не строку.

AlexCooper
30.09.2013, 15:41
30038
Mongo Binary Data
Исправьте, если знаете где допустил ошибку.

AlexCooper
30.09.2013, 15:43
уже думаю кодировать в Base64 чтоли...

AlexCooper
30.09.2013, 16:20
пока так и оставил костыль с Base64
var lic:Object = new Object();
lic.emei = emei.text;
lic.sign = MD5.hash(emei.text);
lic.desc = desc.text;

var ba:ByteArray = new ByteArray();
ba.writeObject(lic);
ba.compress();

var send:Object = new Object();
send.lic = lic;
send.base64 = Base64.encode(ba);

AMF.call('User/licHandler', callbackHandler, send);

public function licHandler($data) {

$data = Security::check($data);

Security::mdb('licence')->insert($data);

return config::responser(array(true));
}

30039

var byteArray:ByteArray = Base64.decode(lic['base64']);
byteArray.uncompress();

var obj:Object = byteArray.readObject();

for ( var i in obj) {
trace(i+" >> "+obj[i]);
}

Psycho Tiger
30.09.2013, 22:37
1) Запишите объект в ByteArray
2) Запишите его в монго
3) Сразу же считайте с монго
4) Побайтово сверьте с тем, что было в пункте 1.
5) Отпишитесь о результате.

AlexCooper
01.10.2013, 17:24
1) Запишите объект в ByteArray
2) Запишите его в монго
На втором этапе AMF бросает еррор, мол не могу найти строку. Соответственно начал юзать гугл.
Но вот только что нашёл в чем проблема собственно.
Я пытался запихнуть файл (ByteArray) через MongoBinData (http://www.php.net/manual/ru/class.mongobindata.php) с типом 0х02 ( БайтАррей ), но в итоге получить обратно ByteArray не получилось и что самое интересное нигде не написали как же получить из бинарных данных обратно байтеррей. Оказалось что есть еще getGridFS (http://stackoverflow.com/questions/9505923/how-to-save-files-on-mongodb-using-php), но не факт что это мне поможет. Буду пробывать. Пока стоит костыль с Base64, в принципе удовлетворяет, так как размер записываемого файла не большой и в итоге получаю запись в базе
[lic] => eNoFwTEOgCAMAMCwkFQf4RcopVhHn1JrMQy6wP/j3bIG8Nd73IhZCBMnZOIDYfTni6fXirurKF5KUoSVspkXwpbRWoXbh0WYPmb4AaxVE00=

Добавлено через 3 минуты
UPD: В базе данных в столбце сохранения какой тип данных указан? в монго нет типов данных. Она сама определяет тип.

Добавлено через 27 минут
проблема скорей всего заключается именно в записи ByteArray и получения его обратно из MongoDB