2009-09-10 11 views
10

Ich habe eine Situation, in der ein Servlet komprimierte Daten für ein PHP-Skript bereitstellt. Ich komprimiere die Daten auf der Java-Seite kein Problem, aber PHP scheint nicht zu dekomprimieren.Komprimieren mit Java Dekomprimieren mit PHP

Hier ist der relevent Code-Schnipsel Java Side:

OutputStream o=response.getOutputStream(); 

GZIPOutputStream gz=new GZIPOutputStream(o); 
gz.write(GridCoder.encode(rs,id, perPage, page).getBytes()); 
gz.close(); 
o.close(); 

PHP Seite:

$xml= gzuncompress($xml); 

Kann mir bitte jemand in die richtige Richtung weisen.

+0

Erhalten Sie Fehler? Können Sie die Protokolle posten? – rogeriopvl

+0

Stellen Sie sicher, dass Ihr Java-Code den HTTP-Header 'Content-Encoding: gzip' festlegt. – Asaph

+0

Warnung: gzuncompress(): Datenfehler. Ich habe versucht, nur die Daten zu wiederholen, ohne zu versuchen, es zu dekomprimieren, um sicherzustellen, dass ich tatsächliche Daten bekomme, und ich bekomme einen Datenblock, der beginnt: [ Content Content-Encoding ist auf gZip auf eingestellt Java Side .. –

Antwort

9

Ich habe gerade Ihre Frage gesehen und war neugierig darauf. Also habe ich meinen eigenen Testfall gemacht. Ich verließ das alle Servlets verwandten Themen aus dem Problem und codiert etwas wie folgt aus:

import java.io.*; 
import java.util.zip.GZIPOutputStream; 

public class GZIPTestcase { 

    public static void main(String[] args) throws Throwable { 
     GZIPOutputStream gzipOutputStream = new GZIPOutputStream(new FileOutputStream(new File("/Users/malax/foo2.gz"))); 
     PrintWriter pw = new PrintWriter(gzipOutputStream); 

     pw.println("All your base are belong to us!"); 
     pw.flush(); 
     pw.close(); 
    } 
} 

Die GNU gunzip der Lage war, um die Daten zu dekomprimieren. Dann versuche ich es mit PHP zu entpacken. Es ist mit demselben Fehler gescheitert, den Sie bekommen haben. Ich untersuchte weiter und fand die folgenden Methoden:

  • gzdecode()
  • gzinflate()

gzinflate funktioniert auch nicht, ist gzdecode nur mit PHP6 wich ausgeliefert i installiert havn't. Vielleicht könntest du das versuchen. (Nach http://bugs.php.net/bug.php?id=22123 wird das funktionieren)

Ich bezweifle, dass das Problem auf der Java-Seite ist, weil GNUs gunzip die Daten deflationieren kann, damit es korrekt sein muss. Vielleicht möchten Sie auf der PHP-Seite weiter untersuchen.

Es gibt eine realte Frage für .NET und PHP, wo das ursprüngliche Poster das gleiche Problem hat wie Sie: Can PHP decompress a file compressed with the .NET GZipStream class?. PHP scheint auch nicht in der Lage zu sein, die Daten aus dem .NET-Äquivalent von GZIPOutputStream zu dekomprimieren.

Tut mir leid, dass ich keine "Lösung" habe, aber ich hätte Sie trotzdem in die richtige Richtung weisen können.

EDIT: Ich fand einen Eintrag in den PHP-Bugtracker, die das Problem erläutert: http://bugs.php.net/bug.php?id=22967 Es scheint, dass gzuncompress GZIP Daten mit Header kann nicht dekomprimieren, das wäre der GZIPOutputStream produziert werden. Wie im Bugtracker-Eintrag angegeben, versuchen Sie, die Kopfzeile zu beschneiden.

6

statt GZIPOutputStream mit DeflaterOutputStream Versuchen

Die PHP-Funktionen in libzlib aufrufen, die DEFLATE implementiert. Gzip ist ein ganz anderes Tier.

Benennung der PHP-Funktionen gz XXX fügt nur zur Verwirrung hinzu.

+0

Das hat für mich funktioniert. – shady

+0

nett, funktioniert gut – radhoo

3

Ich fand einen Weg, um es zu beheben, mit Post von Devon_C_Miller und Malax als Richtlinien.

-Code für Java:

String body = "Lorem ipsum shizzle ma nizle"; 

    URL url = new URL("http://some.url/file.php?id=" + uid); 
    URLConnection conn = url.openConnection(); 
    conn.setDoOutput(true); 
    conn.setRequestProperty("Content-encoding", "deflate"); 
    conn.setRequestProperty("Content-type", "application/octet-stream"); 

    DeflaterOutputStream dos = new DeflaterOutputStream(conn.getOutputStream()); 

    dos.write(body.getBytes()); 
    dos.flush(); 
    dos.close(); 

PHP Seite:

$content = http_get_request_body(); 

    $uncontent = gzuncompress($content); 
+0

+1. Ich habe viele Lösungen ausprobiert, einschließlich "den Header unerkannt von PHP zu schneiden", aber nur das hat funktioniert. Vielen Dank. – firebear

+0

das funktioniert nicht mit Strings, die nach der Komprimierung> 300b haben ... keine Ahnung warum, aber in diesen Fällen 'DeflaterOutputStream' funktioniert wie' GZIPOutputStream' (gibt die gleichen Ergebnisse, nicht dekomprimierbar durch PHP) –

+0

@FlashThunder kann ich nicht Reproduzieren Sie Ihr Problem mit PHP 5.6.15 & Java 8. Ich bin in der Lage, gzuncompress() in PHP eine 1 Million Zeichen lange zufällige Text UTF-8-Zeichenfolge mit einem Java DeflaterOutputStream komprimiert (ähnlich firebear's Antwort ähnlich). Das sind 300KB komprimiert und 1MB komprimiert - weit über 300b. Hier ist der Code, der zum Testen Ihres Fehlers verwendet wurde: https://gist.github.com/cordje/48a957333cd045afa3792c82334d9b06 –

0

Die Kombination von 'Java Deflater + PHP gzuncompress' für mich gearbeitet. Client: Android 4.1.1, Server-Site: php 5.3

Für wen ist die Suche nach Lösung der Komprimierung nur Teile des Anfragekörpers in einigen Fällen, zum Beispiel als ich, HTTP-Form verwenden, um einige Parameter und eine Datei zu veröffentlichen, Das folgende ist das Snippet, das ich in Android-Seite verwendet habe:

public static byte[] compressString(String data) throws IOException { 
     byte[] compressed = null; 
     byte[] byteData = data.getBytes(); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(byteData.length); 
     Deflater compressor = new Deflater(); 
     compressor.setLevel(Deflater.BEST_COMPRESSION); 
     compressor.setInput(byteData, 0, byteData.length); 
     compressor.finish(); 

     // Compress the data 
     final byte[] buf = new byte[1024]; 
     while (!compressor.finished()) { 
      int count = compressor.deflate(buf); 
      bos.write(buf, 0, count); 
     } 
     compressor.end(); 
     compressed = bos.toByteArray(); 
     bos.close(); 
     return compressed; 
    } 
Verwandte Themen