Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用Java压缩用PHP解压缩_Java_Php_Gzip_Gzipoutputstream - Fatal编程技术网

用Java压缩用PHP解压缩

用Java压缩用PHP解压缩,java,php,gzip,gzipoutputstream,Java,Php,Gzip,Gzipoutputstream,我遇到的情况是,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();

我遇到的情况是,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);

有人能给我指一下正确的方向吗。

我刚看到你的问题,很好奇。所以我做了自己的测试用例。我忽略了所有与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也不起作用,gzdecode仅随PHP6一起提供,我还没有安装PHP6。也许你可以试试这个。(根据这一点,这将起作用)

我怀疑问题出在Java方面,因为GNU的gunzip可以压缩数据,所以它必须是正确的。您可能希望在PHP方面进行进一步的研究

对于.NET和PHP有一个真实的问题,其中原始海报与您的问题相同:。PHP似乎也无法从与GZIPOutputStream相当的.NET中解压缩数据

很抱歉,我没有一个“解决方案”,但我可能已经为你指出了正确的方向

编辑:我在PHP Bugtracker中找到一个条目,它解释了问题:
似乎gzuncompress无法使用将生成为GZIPOutputStream的标头解压缩GZIP数据。如Bugtracker条目中所述,尝试裁剪标题。

尝试使用DeflaterOutputStream而不是gzip输出流

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


将PHP函数命名为gzXXX只会增加混淆。

我找到了一种解决方法,使用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);

“Java Deflater+”的组合对我很有用。客户端:安卓4.1.1,服务器站点:PHP5.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;
    }

你有错误吗?您可以发布日志吗?确保您的java代码正在设置
内容编码:gzip
HTTP头。警告:gzuncompress():数据错误。我尝试只回显数据,而不尝试解压缩数据,以确保我得到的是实际数据,我得到的数据块开始:�������[Content Encoding在Java端设置为gZip..+1。我尝试了许多解决方案,包括“剪切PHP无法识别的标题”,但只有这一种有效。谢谢。对于压缩后大于300b的字符串,这不起作用……我不知道为什么,但在这些情况下,
DeflaterOutputStream
的行为类似于
gzipoutstream
(给出相同的结果,PHP无法压缩)@FlashThunder我无法使用PHP 5.6.15和Java 8重现您的问题。我能够在PHP中用Java DeflaterOutputStream压缩100万字符长的随机文本UTF-8字符串(使用类似于firebear的答案)。这是300KB压缩,1MB压缩-远远超过您的300b。以下是用于测试错误的代码: