在PHP上解压缩来自CURL的gzip文件

时间:2010-06-09 01:42:13

标签: php curl gzip gunzip

有谁知道如何解压缩我用curl获取的gzip文件的内容?

例如:http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent

回复了

HTTP/1.1 200 OK
Server: nginx
Date: Wed, 09 Jun 2010 01:11:26 GMT
Content-Type: application/x-bittorrent
Content-Length: 52712
Last-Modified: Tue, 08 Jun 2010 15:09:58 GMT
Connection: keep-alive
Expires: Fri, 09 Jul 2010 01:11:26 GMT
Cache-Control: max-age=2592000
Content-Encoding: gzip
Accept-Ranges: bytes

然后是压缩的gzip,

我试过gzdecode但是没有用,gzeflate也不是他们根本没有得到任何回复,而且文件的内容不超过2k

7 个答案:

答案 0 :(得分:74)

告诉cURL在解压缩时自动解码响应

curl_setopt($ch,CURLOPT_ENCODING, '');

答案 1 :(得分:12)

使用gzdecode

<?php
    $c = file_get_contents("http://torcache.com/" .
        "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
    echo gzdecode($c);

给出

d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42
...

答案 2 :(得分:11)

libcurl提供了一种功能,可以自动解压缩内容(如果使用zlib构建)。

请参阅CURLOPT_ENCODING选项:http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTENCODING

答案 3 :(得分:1)

您是否尝试过设置标题,说明您接受gzip编码如下?:

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));

答案 4 :(得分:1)

使用zlib Stream Wrapper:

file_get_contents("compress.zlib://http://torcache.com/" .
    "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");

答案 5 :(得分:0)

您是否尝试过gzuncompressgzinflate

gzdeflate 压缩,与您想要的相反。说实话,我无法弄清楚gzdecode与正常解压缩的区别。

还有cURL选项CURLOPT_ENCODING

  

“Accept-Encoding:”标题的内容。 这样可以解码响应。支持的编码是“identity”,“deflate”和“gzip”。如果设置了空字符串“”,则发送包含所有支持的编码类型的标头。

这似乎意味着它会自动解压缩响应,但我没有测试过。

答案 6 :(得分:0)

您可以使用gzinflate(假装$ headers包含所有HTTP标头,$ buffer包含您的数据):

if (isset($headers['Content-Encoding']) && ($headers['Content-Encoding'] === 'gzip' || $headers['Content-Encoding'] === 'deflate'))
    {
        if ($headers['Content-Encoding'] === 'gzip')
        {
            $buffer = substr($buffer, 10);
        }
        $contents = @gzinflate($buffer);
        if ($contents === false)
        {
            return false;
        }
    }