2010-06-09 5 views
26

Qualcuno sa come decomprimere il contenuto di un file gzip che ho ottenuto con curl?Decomprimi un file gzip da CURL, su php

ad esempio: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent

risposto

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 

poi gzip compresso,

ho provato gzdecode ma non funziona, gzeflate così non semplicemente non ottengono qualsiasi risposta, e il contenuto dei file non è più di 2k

+0

Puoi pubblicare il tuo codice? –

risposta

8

Uso gzdecode:

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

 
d8:announce42:http://tracker.openbittorrent.com/announce13:announce-listll42 
... 
+3

sì vero, ma ho php 5.2, e dicono che gzdecode è disponibile dal 6.0 solo Ho un gentoo con php e zlib configurato, e non riesco a non avere a disposizione quelle funzioni gz. Qualche idea? :) – PartySoft

+6

Ok, ho una soluzione, non carina perché ho dovuto scrivere su un file il contenuto, e non solo usare una stringa: function gzdecode ($ data) { $ g = tempnam ('/ tmp', 'FF'); @file_put_contents ($ g, $ data); ob_start(); readgzfile ($ g); $ d = ob_get_clean(); scollegare ($ g); return $ d; } e funziona :) – PartySoft

+0

@PartySoft Quella funzione è eccezionale! – barfoon

1

Avete provato a impostare l'intestazione affermando che accettate la codifica gzip come follo ws ?:

curl_setopt($rCurl, CURLOPT_HTTPHEADER, array('Accept-Encoding: gzip,deflate')); 
+3

lo sta già ricevendo codificato, quindi non credo che dichiarare di accettarlo codificato possa fare alcuna differenza. Ho provato a inviare il server Accept-encoding: none e il server non ha rispettato. – Artefacto

0

Hai provato gzuncompress o gzinflate?

gzdeflatecomprime, il contrario di ciò che si desidera. Per essere onesti, non riesco a capire come gzdecode differisca dalla normale decompressione.

C'è anche la possibilità cURL CURLOPT_ENCODING:

Il contenuto del "Accept-Encoding:" header. Ciò consente la decodifica della risposta. Le codifiche supportate sono "identity", "deflate" e "gzip". Se è impostata una stringa vuota, "", viene inviata un'intestazione contenente tutti i tipi di codifica supportati.

Sembra significare che decomprimerà automaticamente la risposta, ma non l'ho verificato.

71

Basta dire cURL per decodificare la risposta automaticamente ogni volta che è compresso con gzip

curl_setopt($ch,CURLOPT_ENCODING, ''); 
+0

Questo ha funzionato bene. –

+0

Questo metodo non richiede php6, così come la risposta 'corretta'. Grazie. – earthmeLon

+3

Il valore deve essere una stringa vuota o un tipo di codifica. non int – redben

1

Con un zlib Stream Wrapper:

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

È possibile farlo con gzinflate (finta le intestazioni $ contengono tutte le intestazioni HTTP e $ buffer contiene i dati):

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; 
     } 
    }