使用PHP解压缩Java

时间:2009-09-10 18:24:41

标签: java php gzip gzipoutputstream

我遇到一种情况,即servlet正在向PHP脚本提供压缩数据。我压缩Java端的数据没问题,但PHP似乎无法解压缩。

以下是相关代码片段   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方面:

$xml= gzuncompress($xml);

有人可以指出我正确的方向。

4 个答案:

答案 0 :(得分:9)

我刚刚看到你的问题并对此感到好奇。所以我做了自己的测试用例。我把所有与Servlet相关的东西都留下了问题并编写了类似的东西:

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();
    }
}

GNU gunzip能够解压缩数据。然后我尝试用PHP解压缩它。它失败了你得到的同样的错误。我进一步调查并发现了以下方法:

  • gzdecode()
  • gzinflate()

gzinflate也不起作用,gzdecode只附带PHP6,我没有安装。也许你可以试试这个。 (根据http://bugs.php.net/bug.php?id=22123这将有效)

我怀疑问题是在Java方面,因为GNU的gunzip可以缩小数据,因此它必须是正确的。您可能希望在PHP方面进一步调查。

对于.NET和PHP存在一个问题,其中原始海报与您具有相同的问题:Can PHP decompress a file compressed with the .NET GZipStream class?。 PHP似乎无法从GZIPOutputStream的.NET等效解压缩数据。

很抱歉,我没有“解决方案”,但无论如何我可能已经指出了正确的方向。

编辑:我在PHP Bugtracker中找到了一个解释问题的条目: http://bugs.php.net/bug.php?id=22967似乎gzuncompress无法使用将生成GZIPOutputStream的标头解压缩GZIP数据。如Bugtracker Entry中所述,尝试裁剪标题。

答案 1 :(得分:6)

尝试使用DeflaterOutputStream而不是GZIPOutputStream

PHP函数调用libzlib实现DEFLATE。 Gzip完全是一个不同的野兽。

命名PHP函数gz XXX 只会增加混乱。

答案 2 :(得分:3)

我找到了一种解决方法,使用Devon_C_Miller和Malax的帖子作为指导。

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方面:

   $content = http_get_request_body();

   $uncontent = gzuncompress($content);

答案 3 :(得分:0)

Java Deflater + PHP gzuncompress'的组合为我工作。客户端:Android 4.1.1,服务器站点:php 5.3

在某些情况下,为谁寻找仅压缩请求正文部分的解决方案,例如我,使用HTTP表单发布一些参数和文件,以下是我在Android端使用的片段:

    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;
    }