Распакуйте файл gzip из CURL, на php - PullRequest
28 голосов
/ 09 июня 2010

Кто-нибудь знает, как распаковать содержимое gzip-файла, который я получил с помощью curl?

, например: 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 ]

75 голосов
/ 19 июля 2010

Просто скажите cURL, чтобы он автоматически декодировал ответ всякий раз, когда он был сжат

curl_setopt($ch,CURLOPT_ENCODING, '');
12 голосов
/ 09 июня 2010

Использование gzdecode:

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

дает

d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42
...
11 голосов
/ 16 июня 2010

libcurl предлагает функцию, которая позволяет автоматически распаковывать содержимое (если оно создано с помощью zlib).

См. Параметр CURLOPT_ENCODING: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTENCODING

1 голос
/ 23 июля 2011

С Zlib Stream Wrapper:

file_get_contents("compress.zlib://http://torcache.com/" .
    "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
1 голос
/ 09 июня 2010

Вы пробовали установить заголовок, подтверждающий, что вы принимаете кодировку gzip следующим образом?:

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
0 голосов
/ 30 августа 2011

Вы можете сделать это с помощью 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;
        }
    }
0 голосов
/ 09 июня 2010

Вы пробовали gzuncompress или gzinflate?

gzdeflate сжимает , противоположное тому, что вы хотите. Если честно, я не могу понять, чем gzdecode отличается от обычного распаковки.

Существует также опция cURL CURLOPT_ENCODING:

Содержимое заголовка «Accept-Encoding:». Это позволяет декодировать ответ. Поддерживаются следующие кодировки: «identity», «deflate» и «gzip». Если задана пустая строка "", отправляется заголовок, содержащий все поддерживаемые типы кодирования.

Похоже, это автоматически распаковывает ответ, но я этого не проверял.

...