我遇到一种情况,即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);
有人可以指出我正确的方向。
答案 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解压缩它。它失败了你得到的同样的错误。我进一步调查并发现了以下方法:
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;
}