2010-06-09 38 views
26

Có ai biết cách giải nén nội dung của tệp gzip mà tôi có bằng curl không?Giải nén tệp gzip từ CURL, trên php

ví dụ: http://torcache.com/torrent/63ABC1435AA5CD48DCD866C6F7D5E80766034391.torrent

đáp

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 

thì gzip nén,

tôi đã cố gắng gzdecode nhưng không hoạt động, gzeflate cũng không đơn giản là họ không nhận được bất kỳ phản hồi nào và nội dung của tệp không quá 2k

+0

Bạn có thể đăng mã của mình không? –

Trả lời

8

Sử dụng gzdecode:

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

cho

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

có đúng, nhưng tôi có php 5.2, và họ nói rằng gzdecode có sẵn từ 6.0 chỉ Tôi có một gentoo với php và zlib cấu hình, và tôi dường như không có sẵn những chức năng gz đó. Bất kỳ ý tưởng nào? :) – PartySoft

+6

Ok, tôi có giải pháp, không đẹp vì tôi phải ghi vào một tệp nội dung và không chỉ sử dụng chuỗi: hàm gzdecode ($ data) { $ g = tempnam ('/ tmp', 'ff'); @file_put_contents ($ g, $ data); ob_start(); readgzfile ($ g); $ d = ob_get_clean(); hủy liên kết ($ g); trả lại $ d; } và hoạt động :) – PartySoft

+0

@PartySoft Chức năng này rất tuyệt! – barfoon

1

Bạn đã thử đặt tiêu đề cho biết rằng bạn chấp nhận mã hóa gzip là follo ws ?:

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

anh ấy đã nhận được nó mã hóa, vì vậy tôi không nghĩ rằng tuyên bố rằng anh ta chấp nhận nó được mã hóa sẽ làm bất kỳ sự khác biệt nào. Tôi đã thử gửi máy chủ Chấp nhận mã hóa: không và máy chủ không tuân thủ. – Artefacto

0

Bạn đã thử gzuncompress hoặc gzinflate?

gzdeflatenén, ngược lại với những gì bạn muốn. Thành thật mà nói, tôi không thể tìm ra cách gzdecode khác với cách giải nén bình thường.

Ngoài ra còn có tùy chọn cURL CURLOPT_ENCODING:

Nội dung của "Accept-Encoding:" tiêu đề. Điều này cho phép giải mã phản hồi. Mã hóa được hỗ trợ là "danh tính", "làm lệch hướng" và "gzip". Nếu một chuỗi rỗng, "", được đặt, tiêu đề chứa tất cả các loại mã hóa được hỗ trợ sẽ được gửi.

Dường như nó sẽ tự động giải nén phản hồi, nhưng tôi chưa thử nghiệm điều đó.

71

Chỉ cần nói cURL để giải mã các câu trả lời tự động bất cứ khi nào nó gzip

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

Điều này hoạt động tốt. –

+0

Phương pháp này không yêu cầu php6, cũng như câu trả lời 'đúng'. Cảm ơn bạn. – earthmeLon

+3

Giá trị phải là chuỗi trống hoặc loại mã hóa. không phải int – redben

1

Với zlib Stream Wrapper:

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

Bạn có thể làm điều đó với gzinflate (giả vờ $ headers chứa tất cả các tiêu đề HTTP của bạn và $ buffer chứa dữ liệu của bạn):

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