Распакуйте файл gzip из CURL на php

Кто-нибудь знает, как распаковать содержимое файла 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


person PartySoft    schedule 09.06.2010    source источник


Ответы (7)


Используйте gzdecode:

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

дает

d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42
...
person Artefacto    schedule 09.06.2010
comment
да, правда, но у меня php 5.2, и они говорят, что gzdecode доступен с 6.0, только у меня есть gentoo с настроенным php и zlib, и я не могу найти эти функции gz. Любые идеи? :) - person PartySoft; 09.06.2010
comment
Хорошо, у меня есть решение, не очень красивое, потому что мне нужно было записать в файл содержимое, а не только использовать строку: function gzdecode($data){ $g=tempnam('/tmp','ff'); @file_put_contents($g,$данные); об_старт(); readgzfile($g); $d=ob_get_clean(); разъединить ($ г); вернуть $д; } и это работает :) - person PartySoft; 09.06.2010
comment
@PartySoft Эта функция великолепна! - person barfoon; 22.10.2011
comment
@PartySoft Спасибо за это! Работал как шарм. Запустил 5.3.X и не повезло с gzuncompress(). - person donut; 18.03.2014
comment
Я предлагаю использовать параметр $length, так как он защищает ваш скрипт от ошибок нехватки памяти. Например, $contents = gzdecode($contents, 10485760); остановит распаковку, если результат превысит 10 МБ. У меня было несколько веб-сайтов, размер которых составлял ‹ 1 МБ в сжатом виде, а после gzdecode() они увеличились до 30 МБ! Если вы предпочитаете CURLOPT_ENCODING, вам следует попробовать CURLOPT_WRITEFUNCTION, если вы также можете остановить результат распаковки. Я не проверял это. - person mgutt; 14.04.2015
comment
какого черта, нет, просто установите для CURLOPT_ENCODING значение gzip, и curl будет автоматически распаковывать ответы, закодированные gzip - person hanshenrik; 25.06.2019

Просто скажите cURL автоматически декодировать ответ всякий раз, когда он сжат gzip.

curl_setopt($ch,CURLOPT_ENCODING, '');
person mixdev    schedule 18.07.2010
comment
Значение должно быть пустой строкой или типом кодировки. не внутри - person redben; 12.07.2012
comment
Спасибо! Разве это не разумная настройка CURL по умолчанию? - person Tom Carnell; 24.07.2013
comment
@redben Мое предложение было отклонено в 2011 году, и теперь предложение АликсАксель было одобрено. :( - person mgutt; 02.04.2015

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

См. параметр CURLOPT_ACCEPT_ENCODING: https://curl.haxx.se/libcurl/c/CURLOPT_ACCEPT_ENCODING.html

person Daniel Stenberg    schedule 15.06.2010

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

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
person Oren Hizkiya    schedule 09.06.2010
comment
он уже получает его закодированным, поэтому я не думаю, что заявление о том, что он принимает его закодированным, будет иметь какое-то значение. Пробовал отправлять на сервер Accept-encoding: none и сервер не соответствовал. - person Artefacto; 09.06.2010

С оболочкой zlib Stream:

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

Пробовали ли вы gzuncompress или gzinflate?

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

Также есть параметр cURL CURLOPT_ENCODING:

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

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

person deceze♦    schedule 09.06.2010

Вы можете сделать это с помощью 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;
        }
    }
person Yvan    schedule 30.08.2011