0
votes

PHPS Base 64_Decode ne convient pas à la chaîne de base 64 en un vrai fichier image fonctionnant

Bonjour les gars, j'ai trouvé avec succès une méthode qui prétend créer un fichier d'entrée de fichier dans une chaîne de base 64 dans JavaScript, donc j'ai envoyé avec succès la base 64

String par JSON via AJAX et la chaîne codée de base 64 ressemble à celle-ci. Dans la méthode JSON "Photo": "Données: image / jpeg; base64, / 9j / 4aaqskzjrgabaqeasabiaad / 2wb, etc ...."

Ainsi, lorsque la chaîne de base 64 arrive dans le fichier PHP. Le PHP est-ce que c'est magique et stocke avec succès un fichier dans le dossier ciblé où je souhaite que le fichier soit à ce moment-là, lorsque je regarde dans ce dossier, il existe un fichier mais

lorsque j'essaie d'ouvrir le fichier photo à Voir l'application Photo Viewer dit quelque chose comme, image.jpg On dirait que nous ne prenons pas en charge ce format de fichier et dans d'autres applications de visualiseur de photos, il dira quelque chose

similaire à ce que j'ai mal fait de mal ?

Voici mon code

index.php xxx

x.php < / strong> xxx


0 commentaires

4 Réponses :


2
votes

Je pense que vous devriez abandonner votre méthodologie actuelle entièrement et la remplacer par ceci: xxx pré>

puis, sur votre code côté serveur, inspectez les résultats comme: P>

<?php
  print_r($_POST); // All of your post fields
  print_r($_FILES); // All of the file uploads
  • Un téléchargement réel et binaire de fichier sans déchets et surcharge de 33% de base-64, ni la CPU de chaque côté pour y faire face LI>
  • Une entrée d'image qui accepte des images simples ( accepter = "image / *" code>) li> Le formulaire
  • peut être soumis par des lecteurs d'écran et d'autres commandes de navigateur, plutôt que de simplement un bouton sans contexte LI>
  • Pas besoin de JavaScript du tout! Li>
  • Standard Streaming em> téléchargements, pour une utilisation moins de mémoire sur votre serveur. LI>
  • Pas besoin de codage / décodage d'un blob potentiellement énorme JSON. LI> ul> p>


1 commentaires

Ne prenez pas ce personnel mais je ne demande pas d'autres méthodes que je demande comment puis-je obtenir cette méthode pour travailler afin que je puisse voir l'image au moins je suis au moins consciente de toutes ces méthodes de transfert de données telles que JS formdata (), HTML Tag, etc ... Je sais qu'ils sont plus faciles, mais je veux à nouveau cette méthode pour des raisons personnelles, merci d'essayer d'aider Brad, mais ce n'est pas une réponse que je cherche merci pour votre temps jusqu'à présent.



1
votes

Brad a indiqué une manière plus efficace, mais à la suite de votre code, je vois que vous gardez la chaîne pas du résultat de base64_decode.

modifier p> xxx pré>

pour p >

//Photo upload section

$photo=$upload_info_json_object->photo;

$photo=base64_decode($photo);


0 commentaires

1
votes

Je vois quelques problèmes majeurs:

  1. sur la ligne 13 de x.php, vous appelez base64_decode , mais n'identifiez pas le résultat. Si devrait lire comme $ photo = base64_decode ($ photo);

  2. Le préfixe utilisé pour afficher l'image dans un navigateur ( Data: image / jpeg; base64, ) ne doit pas être inclus dans le fichier écrit. Ainsi, votre décodage final devrait ressembler à quelque chose comme: xxx

    exploser est la fractionnement sur la première virgule, renvoyant un tableau, et nous accédons juste le deuxième élément qui contient le reste de la chaîne puisque nous la limitait à 2 articles, ce qui signifie qu'il est sécurisé S'il y a une virgule plus tard. (Utilisation de substr et Stros peut être un peu plus efficace, c'est une option fine aussi bien)

    si le type de fichier n'est pas toujours JPEG , vous voudrez analyser cette première partie également pour que vous sachiez quoi utiliser dans le nom de fichier (au moins si vous vous souciez de la portabilité).


    Si cela ne résout pas votre problème, Démarrez Dépannage progressivement: prenez la valeur de JavaScript et comparez-la à la valeur de PHP avant de décoder. Sont-ils identiques? Souvent, vous pouvez obtenir un encodage supplémentaire (par exemple codé par URL) en fonction de la configuration, il est donc important de l'indiquer.

    Si les chaînes ont l'air identique, je passerais à la base64_decode < / Code> Fonction et définissez le paramètre facultatif $ strict sur vrai . Cela entraînera de retourner false s'il y a des caractères non de base64 (au lieu de les laisser tomber silencieusement).

    Vous pouvez également essayer de tester avec une petite chaîne connue (contourner le codage pour vous assurer que ce n'est pas Le problème), tel qu'un pixel 1x1 pixel noir GIF: xxx

    Vous pouvez tester la même chose directement dans PHP pour éliminer l'un quelconque de l'encodage ou du décodage de l'objet JSON ou de son traitement en transit d'être le problème.


2 commentaires

Je viens de poster une réponse J'ai changé de conseils de code et j'ai pris votre conseil, mais je suis différent de ma réponse et laissez-moi savoir ce que vous pensez pouvoir faire à côté de résoudre le problème suivant que j'ai maintenant.


Thomaswayne, vous manquez de mémoire. Lequel pour @ Brad's Point est pourquoi vous ne devriez pas le faire de cette façon. Les téléchargements croisés via les données de formulaire JavaScript sont déjà possibles avec les stratégies de Cors appropriées définies sur le serveur acceptant et n'impliquent pas le traitement des chaînes. J'ai essayé d'aider à la question initiale au cas où cela pourrait aider les autres problèmes de base64, mais je ne pense pas qu'il y ait beaucoup que vous puissiez faire pour votre cas d'utilisation pour continuer à descendre cette route.



-2
votes

Hey Tout au monde, j'ai découvert une raison pour une raison quelconque la chaîne de base 64 est structurée dans le JSON semble ne pas être compatible au côté PHP. J'ai fait un test dans lequel j'ai envoyé une chaîne codée de base 64 dans un objet JSON au côté PHP et je le comparais à une chaîne de base codée 64 du même fichier de

https://www.browrowserling.com/tools/image-a-base64 dans une instruction Si Sincer, par exemple si strong> pour le match et sinon strong> où il est dit que cela ne correspond pas à ma surprise, j'ai découvert que cela m'a donné la déclaration d'autre signification, ils ne correspondent pas au message, alors j'ai découvert que le manière La chaîne de base 64 est p>

codée et structurée au côté JavaScript n'est pas en cours de lecture dans le côté PHP. C'est pourquoi, toutes les applications des visionneuses de photos ne pouvaient pas lire la photo. Je suppose que ses certains caractères de la chaîne JSON codée de base 64 codée, mais les deux cordes comparées de mon si P>

Signal test test ressemble exactement à la même chose, donc j'ai résolu ce problème en googling pour un méthode qui peut échapper aux caractères spéciaux du côté du client et j'ai trouvé cette méthode Appelez Encodégonant (); il échappe à des caractères spéciaux mais pour les URL, donc j'ai bien dit que je suis P>

m ma qui l'essayer à ma surprise lorsque j'ai utilisé cela sur la chaîne de base codée 64 pour l'objet JSON, il a réussi à obtenir cette base 64 chaîne compréhensible dans Le côté du serveur PHP et j'ai pu voir la photo sans problèmes p>

voici mon exemple de travail P>

index.php strong> p>

<?php

$upload_info_json_object = json_decode($_POST['upload_info_json_object']);

$first_name= $upload_info_json_object->first_name;
$last_name= $upload_info_json_object->last_name;


//Photo upload section
$photo= $upload_info_json_object->photo;

//Decode into a file 
$photo= base64_decode($photo); 

file_put_contents('geeksforgeeks-22.jpg',$photo);

//

?>

<h1><?php echo $first_name.' '.$last_name.' just uploaded a photo.'; ?></h1>


0 commentaires