2010-05-31 5 views
2

J'utilise AS3 pour encoder base64 un JPG et le passer à Javascript. J'essaye d'employer AJAX pour passer cette chaîne codée base64 à PHP et ai décodé PHP. (Je sais que je pourrais le renvoyer à Flash et Flash pourrait le décoder et l'envoyer à PHP, mais j'essaie d'éliminer le besoin de Flash à la fin du décodage).Flash à PHP base64 encoder/décoder

Il semble que la fonction de AS3 encodeToBase64String() et et la fonction PHP base64_decode() ne pas utiliser le même algorithme, comme PHP évalue comme un objet codé en base64, mais ne semble pas sortie correctement.

est-il un moyen de remédier à ce problème?

Note: Veuillez pas de messages au sujet de ne pas avoir besoin Javascript. Javascript est une étape nécessaire pour des raisons non détaillées ici.

+0

Qu'est-ce que cela signifie «ne semble pas sortie correctement? Envoyez-vous un en-tête de type de contenu approprié avant d'imprimer des données décodées? –

Répondre

0

Vous ne savez pas ce qui pourrait causer des problèmes. J'ai passé beaucoup de fois les données encodées en base64 à PHP depuis AS3 et je n'ai pas eu de problèmes.

J'utilise généralement Hurlant's base64 :: encodeByteArray() du côté AS3, cependant.

Modifier

Quelque chose comme cela pourrait nous aider à déboguer ce problème:

 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 code de test:

$str = $_REQUEST['str']; 

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

Du côté AS, vous envoyez une chaîne qui encode chaque valeur d'octet possible. Le php va le décoder et l'écrire dans un fichier. Maintenant, si vous ouvrez le fichier généré avec un éditeur hexadécimal, vous devriez voir tous les nombres de 0 à 255 (ou 0x00 ... 0xff). Si ce n'est pas le cas, cela peut donner des indications sur les causes des problèmes.

PS: je poste de AS à PHP directement simplement pour simplifier le dépannage. Peut-être JS est en train de jouer avec vos données en quelque sorte (pas probable puisque base64 devrait être sûr); mais juste pour jeter une source possible du problème.

+0

Un lien vers un encodeur base64 asex! Merci l'homme d'internet! Mon photobooth est maintenant un photobooth fonctionnel! –

2

Ils carte probablement les bits différemment - vous avez un couple d'options. Votre meilleure option serait de trouver une méthode d'encodage similaire qui est mutuelle à flash et php, pour vous épargner du travail supplémentaire. A défaut, vous devrez dupliquer l'encodage de base 64 de flash/php dans l'autre langue. Comme vous utilisez javascript, vous devriez également regarder dans phpjs et voir si vous ne pouvez pas utiliser leur méthode base64_encode, puis passer la chaîne par ajax.

+0

J'allais juste poster sur la version de base64_encode de phpjs + rep –

+0

Nous ne faisons pas d'encodage/décodage en Javascript. En effet, le tableau d'octets JPG renvoyé par JS à JS semble manquer de méthodes. Nous l'encodons donc dans AS3 avant de l'envoyer à JS. – Gus

+0

@Gus: Je ne vois toujours pas pourquoi vous ne pouviez pas simplement passer à javascript. Que voulez-vous dire par le tableau d'octets «manquant de ses méthodes»? – Cam

0

Le codage Base64 fait partie de la rfc MIME (http://www.faqs.org/rfcs/rfc2045.html), donc le php et la version flash ne devraient pas se comporter différemment.

Lorsque des problèmes avec des fonctions php vous devriez toujours lire certains des commentaires dans le manuel PHP (http://ch2.php.net/base64_decode). J'ai trouvé deux personnes ayant des problèmes (et des solutions) pour des problèmes similaires en lisant simplement les meilleurs commentaires. Commencez par le premier commentaire (http://ch2.php.net/manual/en/function.base64-decode.php#92980), qui concerne les problèmes de base64_decode() lorsque la chaîne à décoder est grande (> 5k).La solution proposée est d'utiliser quelque chose comme ceci:

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

Je suis désolé, je ne suis pas au courant d'une meilleure alternative.

0

I passé base64 chaîne codée de php à flash et retour plusieurs fois en utilisant cette classe sur le côté flash com.dynamicflash.util.Base64 (Vous pouvez télécharger SWC et le lier à votre projet)

côté php: standart fonctions de bibliothèque base64_encode et base64_decode

Tout processus de données sans erreurs