Кто-нибудь знает, как распаковать содержимое 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
Используйте gzdecode
:
<?php $c = file_get_contents("http://torcache.com/" . "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent"); echo gzdecode($c);
дает
d8: announce42: HTTP: //tracker.openbittorrent.com/announce13: объявить-listll42 ...
Просто скажите cURL, чтобы автоматически декодировать ответ, когда он был gzipped
curl_setopt($ch,CURLOPT_ENCODING, '');
libcurl предлагает функцию, которая автоматически распаковывает содержимое (если оно построено с помощью zlib).
См. Параметр CURLOPT_ENCODING: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTENCODING
Пробовали ли вы настроить заголовок, утверждая, что вы принимаете кодировку gzip следующим образом ?:
curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate'));
С помощью zlib Stream Wrapper:
file_get_contents("compress.zlib://http://torcache.com/" . "torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent");
Вы пробовали gzuncompress
или gzinflate
?
gzdeflate
compresses , противоположное тому, что вы хотите. Честно говоря, я не могу понять, как gzdecode
отличается от обычного разжатия.
Также существует опция cURL CURLOPT_ENCODING
:
Содержимое заголовка «Accept-Encoding:». Это позволяет декодировать ответ. Поддерживаемые кодировки – это «личность», «дефляция» и «gzip». Если задана пустая строка «", загорается заголовок, содержащий все поддерживаемые типы кодирования.
Кажется, он автоматически декомпрессирует ответ, но я его не тестировал.
Вы можете сделать это с помощью 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; } }