2010-06-09 5 views
26

पर क्या कोई जानता है कि मुझे एक gzip फ़ाइल की सामग्री को असंप्रेषित करने के लिए कैसे किया गया है जो मुझे कर्ल के साथ मिला है?सीआरएल से एक gzip फ़ाइल को असम्पीडित करें, php

उदाहरण के लिए

: 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

+0

क्या आप अपना कोड पोस्ट कर सकते हैं? –

उत्तर

8

उपयोग 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

हाँ सच है, लेकिन मेरे पास PHP 5.2 है, और वे कहते हैं कि gzdecode 6 से उपलब्ध है।0 केवल मेरे पास php और zlib कॉन्फ़िगर किए गए एक gentoo है, और मुझे लगता है कि उन gz कार्यों को उपलब्ध नहीं है। कोई विचार? :) – PartySoft

+6

ठीक है, मेरे पास कोई समाधान है, कोई सुंदर नहीं है क्योंकि मुझे सामग्री को फ़ाइल में लिखना था, न केवल स्ट्रिंग का उपयोग करना: फ़ंक्शन gzdecode ($ डेटा) { $ g = tempnam ('/ tmp', 'एफएफ'); @file_put_contents ($ g, $ डेटा); ob_start(); readgzfile ($ g); $ डी = ob_get_clean(); अनलिंक ($ जी); $ d वापसी; } और यह काम करता है :) – PartySoft

+0

@PartySoft यह कार्य बहुत अच्छा है! – barfoon

1

क्या आपने हेडर सेट करने का प्रयास किया है कि आप gzip एन्कोडिंग को follo के रूप में स्वीकार करते हैं ws ?:

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

वह पहले ही इसे एन्कोड कर रहा है, इसलिए मुझे यह नहीं लगता कि वह इसे एन्कोड करने के लिए स्वीकार करता है, कोई फर्क नहीं पड़ता। मैंने सर्वर स्वीकार करने की कोशिश की-एन्कोडिंग: कोई भी नहीं और सर्वर का पालन नहीं किया गया। – Artefacto

0

आप gzuncompress या gzinflate की कोशिश की है?

gzdeflate संपीड़ित करता है, जो आप चाहते हैं उसके विपरीत। ईमानदार होने के लिए, मैं यह नहीं समझ सकता कि gzdecode सामान्य असम्पीडित से अलग कैसे है।

की सामग्री को "स्वीकार-एन्कोडिंग::" शीर्षक

वहाँ भी cURL विकल्प CURLOPT_ENCODING है। यह प्रतिक्रिया के डीकोडिंग को सक्षम बनाता है। समर्थित एन्कोडिंग "पहचान", "डिफ्लेट" और "gzip" हैं। यदि एक खाली स्ट्रिंग, "" सेट है, तो सभी समर्थित एन्कोडिंग प्रकार वाले हेडर को भेजा जाता है।

ऐसा लगता है कि यह स्वचालित रूप से प्रतिक्रिया को कम कर देगा, लेकिन मैंने इसका परीक्षण नहीं किया है।

71

बस स्वचालित रूप से प्रतिसाद डीकोड करने cURL बता जब भी यह

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

यह अच्छी तरह से काम किया। –

+0

इस विधि को php6 की आवश्यकता नहीं है, जैसा कि 'सही' उत्तर है। धन्यवाद। – earthmeLon

+3

मान खाली स्ट्रिंग या एन्कोडिंग प्रकार होना चाहिए। int – redben

1

gzipped है एक zlib Stream Wrapper:

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

के साथ आप gzinflate साथ यह कर सकते हैं (नाटक कि $ हेडर में आपके सभी HTTP शीर्षलेख होते हैं, और $ बफर में आपका डेटा होता है):

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; 
     } 
    } 
संबंधित मुद्दे