16

我有大量数据(~100k),我的 C# 应用程序正在发送到安装了 mod_gzip 的 Apache 服务器。我正在尝试首先使用 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”适用于客户端提供的标头。

4

5 回答 5

4

我查看了源代码,mod_gzip但找不到任何解压缩数据的代码。显然mod_gzip只压缩传出数据,这并不奇怪。你要找的功能可能很少用到,恐怕你得自己在服务器上解压。

于 2009-07-26T05:05:41.380 回答
4

关于您的问题 Content-Encoding 是否适用于客户端提供的标头 - 根据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
于 2009-07-26T09:24:27.440 回答
2

你需要改变

req.Headers.Add("Content-Encoding: gzip");

req.Headers.Add("Content-Encoding","gzip");
于 2009-12-03T19:22:02.520 回答
1

根据http://www.dominoexperts.com/articles/GZip-servlet-to-gzip-your-pages

您应该将 ContentType() 设置为原始格式,就像我假设的 application/x-www-form-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();
            }
于 2009-07-26T04:14:22.323 回答
0

在 PHP 端,这将从文件中删除页眉和页脚

function gzip_stream_uncompress($data) { return gzinflate(substr($data, 10, -8)); }

于 2014-02-14T03:05:18.773 回答