用Java压缩用PHP解压缩
我遇到的情况是,servlet向PHP脚本提供压缩数据。我在Java端压缩数据没有问题,但PHP似乎无法解压缩 下面是相关的代码片段 Java方面:用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();
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()
- 充气
似乎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。以下是用于测试错误的代码: