Flash / PHP base64 кодирование / декодирование - PullRequest
2 голосов
/ 01 июня 2010

Я использую AS3 для base64, кодирую JPG и передаю его в Javascript. Я пытаюсь использовать AJAX для передачи этой строки в кодировке base64 в PHP и сделать так, чтобы PHP ее декодировал. (Я знаю, что мог бы отправить его обратно во Flash, а Flash мог бы его декодировать и отправить в PHP, но я пытаюсь устранить необходимость во Flash на конце декодирования).

Похоже, что функция encodeToBase64String() в AS3 и функция base64_decode() в PHP не используют один и тот же алгоритм, поскольку PHP оценивает его как объект в кодировке base64, но, похоже, не выводит его должным образом.

Есть ли способ исправить эту проблему?

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

Ответы [ 4 ]

2 голосов
/ 01 июня 2010

Они, вероятно, отображают биты по-разному - у вас есть пара вариантов. Лучшим вариантом было бы найти аналогичный метод кодирования, который является взаимным для flash и php, чтобы сэкономить себе немного дополнительной работы. Если это не удастся, вам придется продублировать кодировку flash / php base 64 на другом языке.

Поскольку вы используете javascript, вам также следует заглянуть в phpjs и посмотреть, нельзя ли использовать их метод base64_encode, а затем передать строку через ajax.

0 голосов
/ 02 июня 2010

Я передавал кодированную base64 строку из php во flash и обратно много раз, используя этот класс на флеш стороне com.dynamicflash.util.Base64 (Вы можете скачать SWC и связать его с вашим проектом)

на стороне php: стандартные функции библиотеки base64_encode и base64_decode

Все данные обрабатываются без ошибок

0 голосов
/ 01 июня 2010

Кодировка Base64 является частью MIME rfc (http://www.faqs.org/rfcs/rfc2045.html),, поэтому версия php и flash не должны вести себя по-разному.

Когда возникают проблемы с функциями php, вы всегда должны читать некоторые комментарии в руководстве по PHP (http://ch2.php.net/base64_decode).). Я обнаружил, что у двух людей возникли проблемы (и решения) по схожим проблемам, просто прочитав верхние комментарии.

Начните с первого комментария (http://ch2.php.net/manual/en/function.base64-decode.php#92980),, который касается вопросов base64_decode (), когда строка, которая должна быть декодирована, является большой (> 5 КБ). Предлагаемое решение состоит в том, чтобы использовать что-то подобное:

<?php
$decoded = "";
for ($i=0; $i < ceil(strlen($encoded)/256); $i++)
   $decoded = $decoded . base64_decode(substr($encoded,$i*256,256));
?> 

Извините, я не знаю лучшей альтернативы.

0 голосов
/ 01 июня 2010

Не уверен, что может вызвать проблемы. Я много раз передавал данные в кодировке base64 в php из AS3 и не сталкивался с проблемами.

Обычно я использую Hurlant Base64 :: encodeByteArray () на стороне AS3.

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

Примерно так может помочь в отладке этой проблемы:

        var buffer:ByteArray = new ByteArray();
        for(var i:int = 0; i < 256; i++) {
            buffer[i] = i;
        }

        var str:String = Base64.encodeByteArray(buffer); // this is com.hurlant.util.Base64
        // post your data to your php (directly or through JS)

Тестовый код Php:

$str = $_REQUEST['str'];

$decoded = base64_decode($str);
file_put_contents("test.txt",$decoded);

На стороне AS вы отправляете строку, которая кодирует каждое возможное значение байта. PHP расшифрует его и запишет в файл. Теперь, если вы откроете сгенерированный файл с помощью шестнадцатеричного редактора, вы должны увидеть все числа от 0 до 255 (или 0x00 ... 0xff). Если это не так, это может дать некоторые подсказки о причинах проблем.

PS: я бы отправлял сообщения из AS в PHP напрямую, чтобы упростить устранение неполадок. Возможно, JS как-то портит ваши данные (маловероятно, поскольку base64 должен быть безопасным); но просто чтобы исключить возможный источник проблемы.

...