33

有谁知道如何解压缩我用 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

4

7 回答 7

82

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

curl_setopt($ch,CURLOPT_ENCODING, '');
于 2010-07-18T20:55:28.017 回答
15

使用gzdecode

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

d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42
...
于 2010-06-09T02:05:39.893 回答
13

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

请参阅 CURLOPT_ACCEPT_ENCODING 选项:https ://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html

于 2010-06-15T22:19:10.813 回答
1

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

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
于 2010-06-09T01:56:48.803 回答
1

使用zlib 流包装器:

file_get_contents("compress.zlib://http://torcache.com/" .
    "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
于 2011-07-22T21:03:48.780 回答
0

你试过了吗gzuncompressgzinflate

gzdeflate compresses,与您想要的相反。老实说,我无法弄清楚gzdecode与正常解压缩有何不同。

还有 cURL 选项CURLOPT_ENCODING

“Accept-Encoding:”标头的内容。这使得能够对响应进行解码。支持的编码是“identity”、“deflate”和“gzip”。如果设置了空字符串“”,则会发送包含所有支持的编码类型的标头。

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

于 2010-06-09T02:00:56.440 回答
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;
        }
    }
于 2011-08-30T12:35:43.020 回答