使用Java与PHP压缩解压(Compressing with Java Decompressing

2019-07-17 15:57发布

我这里有一个servlet是提供压缩的数据PHP脚本的情况。 我压缩在Java端没有问题的数据,但是PHP似乎无法解压缩。

这里是培训相关的代码片段Java方面:

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

可有人请点我在正确的方向。

Answer 1:

我刚才看到你的问题,是好奇吧。 所以我做了我自己的测试情况。 我将所有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一个realted问题在那里,你有原来的海报有同样的问题: 可以在PHP解压与.NET GZipStream类的压缩文件? 。 PHP似乎并不能够无论是从GZIPOutputStream的.NET相当于解压缩数据。

抱歉,我没有一个“解决方案”,但我可能会指出你在正确的方向反正。

编辑:我发现在PHP错误追踪这也解释了问题的条目: http://bugs.php.net/bug.php?id=22967似乎gzuncompress不能与解压缩,这将是GZIPOutputStream产生头GZIP数据。 正如错误追踪该项记录中,尝试裁剪头。



Answer 2:

尝试使用DeflaterOutputStream代替GZIPOutputStream

PHP函数调用到libzlib它实现缩小。 Gzip已完全不同的野兽。

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



Answer 3:

我找到了一种方法来解决它,使用后由Devon_C_Miller和马拉克斯作为准则。

代码的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);


Answer 4:

“Java的Deflater +的结合PHP gzuncompress ”为我工作。 客户:安卓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;
    }


文章来源: Compressing with Java Decompressing with PHP