我有我的C#应用程序在发送到我的Apache服务器安装mod_gzip的大量数据(约10万)。 我试图给gzip首先使用System.IO.Compression.GZipStream数据。 PHP接收原始gzip压缩的数据,因此Apache不解压它,因为我期望的那样。 我缺少的东西吗?
System.Net.WebRequest req = WebRequest.Create(this.Url);
req.Method = this.Method; // "post"
req.Timeout = this.Timeout;
req.ContentType = "application/x-www-form-urlencoded";
req.Headers.Add("Content-Encoding: gzip");
System.IO.Stream reqStream = req.GetRequestStream();
GZipStream gz = new GZipStream(reqStream, CompressionMode.Compress);
System.IO.StreamWriter sw = new System.IO.StreamWriter(gz, Encoding.ASCII);
sw.Write( large_amount_of_data );
sw.Close();
gz.Close();
reqStream.Close()
System.Net.WebResponse resp = req.GetResponse();
// (handle response...)
我不能完全肯定“内容编码:gzip”适用于客户提供的头文件。
我看着的源代码mod_gzip
,我无法找到解压缩数据的任何代码。 显然mod_gzip
只压缩输出数据这是不是太奇怪毕竟。 您正在寻找的功能可能是很少使用,我怕你必须做在服务器上自己减压。
关于你的问题是否内容编码适用于客户端提供的头文件-根据HTTP / 1.1标准 ,它是:
(从第7部分)
如果没有另外由请求方法或响应状态代码限制请求和响应消息可以传送的实体。
(从第7.1节)
entity-header = Allow ; Section 14.7 | Content-Encoding ; Section 14.11 | Content-Language ; Section 14.12 | Content-Length ; Section 14.13 | Content-Location ; Section 14.14 | Content-MD5 ; Section 14.15 | Content-Range ; Section 14.16 | Content-Type ; Section 14.17 | Expires ; Section 14.21 | Last-Modified ; Section 14.29 | extension-header
你需要改变
req.Headers.Add("Content-Encoding: gzip");
至
req.Headers.Add("Content-Encoding","gzip");
据http://www.dominoexperts.com/articles/GZip-servlet-to-gzip-your-pages
你应该的setContentType(),以原始格式,因为你与应用程序/ x-WWW窗体-urlencoded我想这样做。 然后...
// See if browser can handle gzip
String encoding=req.getHeader("Accept-Encoding");
if (encoding != null && encoding.indexOf("gzip") >=0 ) { // gzip browser
res.setHeader("Content-Encoding","gzip");
OutputStream o=res.getOutputStream();
GZIPOutputStream gz=new GZIPOutputStream(o);
gz.write(content.getBytes());
gz.close();
o.close();
} else { // Some old browser -> give them plain text. PrintWriter o = res.getWriter();
o.println(content);
o.flush();
o.close();
}
在PHP端这将去掉从文件的页眉和页脚
function gzip_stream_uncompress($data) { return gzinflate(substr($data, 10, -8)); }