2010-06-09 5 views
26

Kann jemand den Inhalt einer gzip-Datei, die ich mit curl bekommen habe, dekomprimieren?Dekomprimieren Sie eine Gzip-Datei von CURL, auf PHP

zum Beispiel: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent

reagierte
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 

dann die komprimierten gzip,

i gzdecode versucht, aber nicht funktioniert, gzeflate auch nicht, dass sie einfach nicht bekommen, jede Antwort, und der Inhalt der Dateien sind nicht mehr als 2k

+0

Können Sie Ihren Code posten? –

Antwort

8

Verwendung gzdecode:

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

gibt

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

Ja stimmt, aber ich habe php 5.2, und sie sagen, dass gzdecode seit 6 verfügbar ist.0 nur Ich habe ein Gentoo mit PHP und Zlib konfiguriert, und ich kann nicht scheinen, diese gz-Funktionen zur Verfügung zu haben. Irgendwelche Ideen? :) – PartySoft

+6

Ok, ich habe eine Lösung, nicht schön, weil ich in eine Datei den Inhalt schreiben musste, und nicht nur eine Zeichenkette verwenden: Funktion gzdecode ($ Daten) { $ g = tempnam ('/ tmp', "ff"); @file_put_contents ($ g, $ data); ob_start(); readgzfile ($ g); $ d = ob_get_clean(); unlink ($ g); zurückgeben $ d; } und es funktioniert :) – PartySoft

+0

@PartySoft Diese Funktion ist großartig! – barfoon

1

Haben Sie versucht, die Überschrift, dass Sie akzeptieren, Gzip-Codierung als follo ws ?:

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

er empfängt es bereits verschlüsselt, also glaube ich nicht, zu erklären, dass er es verschlüsselt akzeptiert, würde einen Unterschied machen. Ich habe versucht, den Server Accept-Encoding zu senden: keine und der Server nicht eingehalten. – Artefacto

0

Haben Sie versucht, gzuncompress oder gzinflate?

gzdeflatekomprimiert, das Gegenteil von dem, was Sie wollen. Um ehrlich zu sein, kann ich nicht herausfinden, wie sich gzdecode von der normalen Dekomprimierung unterscheidet.

Es gibt auch die Option cURL CURLOPT_ENCODING:

Der Inhalt des "Accept-Encoding:" Header. Dies ermöglicht die Decodierung der Antwort. Unterstützte Kodierungen sind "Identität", "deflate" und "gzip". Wenn eine leere Zeichenfolge "" festgelegt ist, wird eine Kopfzeile mit allen unterstützten Codierungstypen gesendet.

Es scheint zu bedeuten, dass es die Antwort automatisch dekomprimiert, aber ich habe das nicht getestet.

71

Nur cURL sagen die Antwort automatisch zu entschlüsseln, wenn sie es mit gzinflate gzip ist

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

Das hat gut funktioniert. –

+0

Diese Methode erfordert nicht php6, ebenso wenig wie die 'richtige' Antwort. Vielen Dank. – earthmeLon

+3

Wert sollte leerer String oder Codierungsart sein. nicht int – redben

1

Mit einem zlib Stream Wrapper:

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

Sie tun können (vorgeben $ Headers enthält alle Ihre HTTP Header und $ Buffer enthält Ihre Daten):

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