10
votes

Compression avec décompression Java avec PHP

J'ai une situation où un servlet fournit des données compressées à un script PHP. Je compresse les données sur le côté Java sans problème, mais PHP semble incapable de décompresser.

Voici les extraits de code pertinents Java côté: xxx

côté PHP: xxx

peut-il que quelqu'un puisse me signaler dans la bonne direction.


3 commentaires

Avez-vous des erreurs? Pouvez-vous poster les journaux?


Assurez-vous que votre code Java définit le fichier encodage de contenu: gzip HTTP en-tête.


AVERTISSEMENT: GZUNCompress (): Erreur de données. J'ai essayé simplement de faire écho aux données sans essayer de le décompresser pour que je reçois des données réelles et que je reçois un bloc de données qui démarre: [Le contenu du contenu-coding est défini sur Gzip sur le Java Côté..


4 Réponses :


11
votes

Je viens de voir votre question et j'étais curieux à ce sujet. Donc, j'ai fait mon propre test de test. J'ai laissé tous les trucs liés au servlet sur le problème et codé quelque chose comme ceci: xxx

Le GNU Gunipip a pu décompresser les données. Ensuite, j'essaie de décompresser avec PHP. Il a échoué avec la même erreur que vous avez. J'ai étudié davantage et j'ai trouvé les méthodes suivantes:

  • gzdecode ()
  • gzinflate ()

    gzinflate ne fonctionne pas non plus, GZDecode n'est livré que avec PHP6 ce que je n'ai pas installé. Peut-être que vous pourriez essayer cela. (Selon http://bugs.php.net/bug.php?id=22123 Cela fonctionnera)

    Je doute que le problème soit sur le côté Java, car Gunzip de GNU peut dégonfler les données afin que ce soit correct. Vous voudrez peut-être enquêter plus loin sur le côté PHP.

    Il existe une question récitante pour .NET et PHP où l'affiche originale a le même problème que vous avez: PHP décompresser un fichier compressé avec la classe gzipstream. . PHP ne semble pas être capable de décompresser les données de l'équivalent .NET de la gzipoutputtstream non plus.

    Désolé de ne pas avoir de "solution" mais j'aurais peut-être signalé que je vous ai signalé dans la bonne direction. < / P>

    Edit: J'ai trouvé une entrée dans la PHP BugTracker qui explique le problème: http://bugs.php.net/bug.php?id=22967 Il semble que GzunCompress ne puisse pas décompresser les données GZIP avec des en-têtes qui seront produites soit la gzipoutputtream. Comme indiqué dans l'entrée de BugTracker, essayez de recadrer l'en-tête.


0 commentaires

6
votes

Essayez d'utiliser DeflaterOutPutStream au lieu de GzipOutputStream

Les fonctions PHP appellent dans la libzlib que les outils se dégonflent. GZIP est une bête différente entièrement.

nommer les fonctions PHP GZ xxx ajoute uniquement à la confusion.


0 commentaires

3
votes

J'ai trouvé un moyen de le réparer, en utilisant Post par devon_c_miller et malax comme des directives.

Code pour Java: P>

   $content = http_get_request_body();

   $uncontent = gzuncompress($content);


3 commentaires

+1. J'ai essayé de nombreuses solutions, y compris lesquelles «couper l'en-tête non reconnu par PHP», mais seulement cela a fonctionné. Merci.


Cela ne fonctionne pas avec des chaînes qui ont après la compression> 300b ... ne savent pas pourquoi, mais dans ces cas DeflaterOutPutStream Agit comme GzipOutPutStream (donnant les mêmes résultats, non recressables par Php)


@FlashThunder, je ne peux pas reproduire votre problème à l'aide de PHP 5.6.15 et Java 8. Je suis capable de gzuncompress () dans PHP A 1 million de caractères Texte aléatoire de longue durée UTF-8 String comprimé avec un Java DeflaterOutPutStream (en utilisant la réponse similaire à la réponse de Firebare ). C'est 100kb comprimé et 1 Mo comprimé - de loin supérieur à votre 300b. Voici le code utilisé pour tester votre bogue: gist.github.com/cordje/48A957333CD045AFA3792C82334D9B06



1
votes

La combinaison de 'Java Deflater + php gzuncommout ' a travaillé pour moi. Client: Android 4.1.1, Site serveur: PHP 5.3

Pour qui recherche la solution de compression uniquement des parties du corps de la demande dans certains cas, par exemple comme moi, en utilisant le formulaire HTTP pour poster des paramètres et un fichier, le Voici le snippet que j'ai utilisé à l'android: xxx


0 commentaires