2010-06-09 61 views
26

¿Alguien sabe cómo descomprimir los contenidos de un archivo gzip que obtuve con curl?Descomprime un archivo gzip de CURL, en php

por ejemplo: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent

respondió

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 

entonces el gzip comprimido,

he intentado gzdecode pero que no funciona, gzeflate así no que simplemente no consiguen cualquier respuesta, y el contenido de los archivos no es más que 2k

+0

¿Se puede publicar el código? –

Respuesta

8

Uso gzdecode:

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

da

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

si cierto, pero tengo php 5.2, y dicen que gzdecode está disponible desde 6.0 solamente Tengo un gentoo con php y zlib configurado, y parece que no puedo tener esas funciones gz. Cualquier ideeas? :) – PartySoft

+6

Ok, tengo una solución, no es bonita porque tuve que escribir en un archivo el contenido, y no solo uso una cadena: función gzdecode ($ data) { $ g = tempnam ('/ tmp', 'ff'); @file_put_contents ($ g, $ data); ob_start(); readgzfile ($ g); $ d = ob_get_clean(); desvincular ($ g); return $ d; } y funciona :) – PartySoft

+0

@PartySoft ¡Esa función es genial! – barfoon

1

¿Ha intentado configurar el encabezado indicando que acepta la codificación gzip como follo ws ?:

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

ya lo está recibiendo codificado, así que no creo que declarar que él lo acepta codificado haría cualquier diferencia. Intenté enviar el servidor Accept-encoding: none y el servidor no cumplió. – Artefacto

0

Ha intentado gzuncompress o gzinflate?

gzdeflatecomprime, lo contrario de lo que desea. Para ser sincero, no puedo entender cómo difiere gzdecode de la descompresión normal.

También existe la opción de cURL CURLOPT_ENCODING:

El contenido de la "Accept-Encoding:" encabezado. Esto habilita la decodificación de la respuesta. Las codificaciones admitidas son "identidad", "desinflar" y "gzip". Si se establece una cadena vacía, "", se envía un encabezado que contiene todos los tipos de codificación admitidos.

Parece que significa que se descomprimirá automáticamente la respuesta, pero no he probado eso.

71

Sólo decirle cURL para decodificar la respuesta automáticamente cada vez que se gzipped

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

Esto funcionó muy bien. –

+0

Este método no requiere php6, al igual que la respuesta "correcta". Gracias. – earthmeLon

+3

El valor debe ser una cadena vacía o un tipo de codificación. no int – redben

1

Con un zlib Stream Wrapper:

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

Puede hacerlo con gzinflate (fingiendo que $ encabezados contiene todos sus encabezados HTTP, y $ buffer contiene sus datos):

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