PHP可以解压使用.NET GZipStream类压缩的文件吗?

4
我有一个C#应用程序,与基于PHP的SOAP Web服务进行通信,以获取更新和许可证。
现在,我正在为用户设计反馈系统,使其能够通过软件自动提交错误和跟踪日志。根据我之前发布的问题,我认为Web服务是最好的方式(最可能正常工作且配置最少)。
我目前的想法是使用.NET内置的gzip压缩来压缩文本文件,转换为base64格式,发送到Web服务,并让PHP脚本将数据转换为二进制并解压缩。
PHP可以解压使用GZipStream压缩的数据吗?如果可以,怎么做?
6个回答

7

我实际尝试了这个。GZipStream不起作用。另一方面,在.NET端使用DeflateStream进行压缩,在PHP端使用gzinflate进行解压缩是可行的。但结果可能因情况而异...


我刚刚原型化了这个解决方案,它可以工作。现在我只需要处理PHP内存分配错误,因为要解压缩和转义大文件。 - Chris Thompson

1
如果http级别的库实现了它(客户端和服务器都是),{{link1:http支持gzip压缩}},在这种情况下就没有必要手动压缩任何内容。在进一步操作之前,您应该检查是否已经发生了这种情况。

1
这对于客户端发送数据有效吗?我已经从服务器到客户端进行了gzip编码,但是没有从客户端到服务器进行过编码。 - Chris Thompson
我非常确定它符合HTTP的规范。但是它是否被实现支持是另一回事。不过,我认为这值得调查。 - troelskn

0

我能够使用C#和PHP演示Gzip。

C#中的Gzip压缩:

using System;
using System.IO;
using System.IO.Compression;
using System.Text;

public class Program {
    public static void Main() {
        string s = "Hi!!";

        byte[] byteArray = Encoding.UTF8.GetBytes(s);
        byte[] b2 = Compress(byteArray);

        Console.WriteLine(System.Convert.ToBase64String(b2));
    }

    public static byte[] Compress(byte[] bytes) {
        using (var memoryStream = new MemoryStream()) {
            using (var gzipStream = new GZipStream(memoryStream, CompressionLevel.Optimal)) {
                gzipStream.Write(bytes, 0, bytes.Length);
            }
            return memoryStream.ToArray();
        }
    }

    public static byte[] Decompress(byte[] bytes) {
        using (var memoryStream = new MemoryStream(bytes)) {

            using (var outputStream = new MemoryStream()) {
                using (var decompressStream = new GZipStream(memoryStream, CompressionMode.Decompress)) {
                    decompressStream.CopyTo(outputStream);
                }
                return outputStream.ToArray();
            }
        }
    }
}

上面的代码打印了Base64编码的压缩字符串,即H4sIAAAAAAAEAPPIVFQEANxaFPgEAAAA,对于输入Hi!!

以下是在PHP中解压缩的代码:

echo gzdecode(base64_decode('H4sIAAAAAAAEAPPIVFQEANxaFPgEAAAA'));

0

是的,PHP可以解压缩带有或不带有头部信息的GZIP压缩字符串。

  • gzdecode 适用于GZIP文件格式(即与gzip兼容)
  • gzinflate 适用于“原始”DEFLATE格式
  • gzuncompress 适用于ZLIB格式(GZIP格式没有一些头部信息)

我不确定你需要哪一个,因为我不熟悉.NET GZipStream。听起来有点像gzuncompress,因为ZLIB格式有点像“流”格式,但是尝试所有三个函数。


2
供日后参考:gzinflate是一种用于解压缩GZipStream压缩数据的方法。 - Chris Thompson
1
@ChrisThompson 什么?不对。gzdecode() 将会解压缩 GZipStream 压缩的数据。唯一需要使用 gzinflate() 的情况,是当你从 GZipStream 输出的数据中剥离了 gzip 头部和尾部时。 - Mark Adler

0

由于服务器正在接受Web请求,您真的应该检查HTTP标头以确定是否有任何客户端接受GZIP编码,而不是仅仅猜测并每次都进行gzip压缩。

如果PHP客户端可以执行gzip,它会设置标头,然后您的代码将根据情况做出反应并执行正确的操作。假设或猜测是一个很差的选择,当提供您的代码学习客户端能力的工具时。


我认为这不适用。客户端是C#应用程序,服务器是基于PHP的。客户端启动与服务器的连接,因此标头将由客户端(C#)应用程序生成,而不是服务器。 - Chris Thompson
@Chris 你误解了重点,客户端需要告诉服务器它想要什么以及如何获取。就像使用URL来标识资源一样,头部的原因是包括各种元数据,包括客户端希望接收的编码格式。你误解了头部背后的全部原因,它们允许客户端发送额外的信息,服务器可以根据这些信息定制响应。 - mP.
例如,用户可以检查一个标头(header)来查询他们首选的语言及其权重,通知你他们想要什么语言。你的服务器应该自然地检查这一点,并在可能的情况下调整响应。如果你正在编写国际应用程序,那么检查并为此服务是有意义的......并非所有人都会说英语,如果用户想要西班牙语或德语,发送英语将是愚蠢的。 - mP.

0
我最近写了一篇文章,展示了如何在C#中进行压缩/解压。我在几乎相同的场景下使用它。我想将客户端的日志文件传输到服务器,而这些日志文件通常非常大。但是,在我的情况下,我的Web服务正在运行.NET,因此我可以使用解压缩方法。但是,看起来PHP确实支持一个名为gzdecode的方法,可以起到同样的作用。

http://coding.infoconex.com/post/2009/05/Compress-and-Decompress-using-net-framework-and-built-in-GZipStream.aspx


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接