web-dev-qa-db-fra.com

Décompressez un fichier gzip de CURL, sur php

Quelqu'un sait-il comment décompresser le contenu d'un fichier gzip que j'ai obtenu avec curl?

par exemple: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent

a répondu

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

puis le gzip compressé,

j'ai essayé gzdecode mais ne fonctionne pas, gzeflate aussi ne reçoit-il simplement aucune réponse, et le contenu des fichiers ne dépasse pas 2k

31
PartySoft

Utilisez gzdecode :

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

donne

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

Dites simplement à cURL de décoder la réponse automatiquement chaque fois qu'elle est compressée

curl_setopt($ch,CURLOPT_ENCODING, '');
76
mixdev

libcurl offre une fonctionnalité qui lui permet de décompresser le contenu automatiquement (s'il est construit avec zlib).

Voir l'option CURLOPT_ENCODING: http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTENCODING

11
Daniel Stenberg

Avez-vous essayé de définir l'en-tête indiquant que vous acceptez l'encodage gzip comme suit?:

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

Avec un zlib Stream Wrapper:

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

Avez-vous essayé gzuncompress ou gzinflate ?

gzdeflate compresse , l'opposé de ce que vous voulez. Pour être honnête, je ne peux pas comprendre en quoi gzdecode diffère de la décompression normale.

Il y a aussi l'option cURL CURLOPT_ENCODING :

Le contenu de l'en-tête "Accept-Encoding:". Cela permet le décodage de la réponse. Les codages pris en charge sont "identité", "dégonfler" et "gzip". Si une chaîne vide, "", est définie, un en-tête contenant tous les types de codage pris en charge est envoyé.

Cela semble signifier que cela décompressera automatiquement la réponse, mais je n'ai pas testé cela.

0
deceze

Vous pouvez le faire avec gzinflate (en prétendant que $ headers contient tous vos en-têtes HTTP et $ buffer contient vos données):

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
Yvan