Le téléchargement du fichier PNG sur le serveur nginx via HTTP_RAW_POST_DATA entraîne une image corrompue

J’essaie de déboguer ce problème en publiant des données d’image PNG brutes sur le serveur avec l’aide de Postman . Voici une capture d’écran qui pourrait aider à comprendre le problème:

entrer la description de l'image ici

Sur le serveur je reçois le fichier comme suit:

$png = $GLOBALS["HTTP_RAW_POST_DATA"]; 

Ensuite, j’écris les données dans un nouveau fichier:

 $fh = fopen($myFile, 'w') or die("can't open file"); fwrite($fh, $png); fclose($fh); 

Le fichier est enregistré correctement, mais il a maintenant une taille de fichier différente, 417 Ko au lieu de 279 Ko, ce qui correspond à la taille du fichier d’origine.

Maintenant, bien sûr, je ne peux faire aucune opération d’image car aucune des fonctions (telles que getimagesize qui renvoie bool(false) ) ne reconnaît le fichier comme une image valide.

J’ai débogué ce processus à un point tel que le problème doit être quelque part dans les opérations de fichiers, mais je ne comprends pas pourquoi le fichier ne donne pas exactement le même type de fichier et la même taille que l’original, Je suis en train d’utiliser les mêmes données brutes.

METTRE À JOUR:

J’ai maintenant comparé les encodages du fichier original avec le fichier téléchargé, et le premier est dans ISO-8859-1 et il s’affiche correctement, ce dernier est en UTF-8 et a environ 138 Ko de plus en taille de fichier.

Maintenant, j’ai réussi à convertir le fichier sur le serveur en ISO-8859-1.

 fwrite($fh, iconv("UTF-8", "ISO-8859-1", $png)); 

Le fichier résultant a maintenant la même taille de fichier de sortie (279 Ko), mais il n’est toujours pas reconnu en tant qu’image PNG, certaines informations semblent toujours perdues.

MISE À JOUR (1):

J’ai été en mesure d’examiner le problème plus en détail et j’ai découvert que le fichier d’origine avait exactement 4 octets de plus que le fichier généré, de sorte que le fichier PNG résultant semble être corrompu.

Capture d'écran du terminal montrant les deux tailles de fichier différentes

MISE À JOUR (2):

Je suis maintenant en mesure de sauvegarder le fichier et de l’ouvrir en tant que fichier PNG valide. Le code suivant semble enregistrer l’image correctement:

 $input = fopen("php://input","r+"); $destination = fopen($myFile, 'w+'); stream_copy_to_stream($input, $destination); fclose($input); fclose($destination); 

Cependant, lorsque j’essaie d’ouvrir le fichier avec la fonction imagecreatefrompng , j’obtiens une erreur 500. J’essaie maintenant de savoir s’il s’agit d’un problème de mémoire en PHP.

Le problème pourrait être la façon dont vous testez votre POST en copiant les données “binarys” dans un champ de texte.

Si vous collez les mêmes données dans un éditeur de texte, vous n’obtiendrez pas non plus de fichier image valide lors de sa sauvegarde avec l’extension png.

Essayez de créer un formulaire simple avec un champ de fichier pour tester votre téléchargement

J’utilise nginx pour les téléchargements et je n’ai pas eu de problème, mais j’utilise la méthode PHP standard pour télécharger les fichiers selon: http://www.php.net/manual/en/features.file-upload.post-method. php

Je suggère d’essayer cela.

Essayez d’utiliser: Pour obtenir les données brutes. Je l’utilise parfois pour obtenir des données envoyées depuis un article ajax sur le gâteau.