2010-05-31 2 views
2

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

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

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

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

+0

что значит "не кажется, что выводит его правильно? Вы отправляете правильный заголовок типа контента перед печатью декодированных данных? –

ответ

0

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

Я обычно использую Hurlant's 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 должен быть безопасным); а просто отбросить возможный источник проблемы.

+0

Ссылка на рабочий кодировщик base3 base3! Спасибо, человек из Интернета! Моя фотобумага теперь является функциональной фотобубой! –

2

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

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

+0

Я просто собирался опубликовать версию phpjs base64_encode + rep –

+0

Мы фактически не делаем кодирование/декодирование в Javascript. Это связано с тем, что массив байтов JPG, который AS3 возвращает в JS, кажется, не имеет своих методов, поэтому мы кодируем его в AS3, прежде чем он будет отправлен в JS. – Gus

+0

@Gus: Я до сих пор не понимаю, почему вы не могли просто передать его javascript. Что вы подразумеваете под массивом байтов, лишенным его методов? – Cam

0

Кодировка 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(), когда строка, подлежащая расшифровке, является большой (> 5k).Предлагаемое решение состоит в том, чтобы использовать что-то вроде этого:

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

Прошу прощения, я не знаю лучшей альтернативы.

0

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

на стороне PHP: Standart библиотечные функции base64_encode и base64_decode

Все данные процесса без ошибок