2011-09-12 31 views
5

Tôi muốn tải xuống lưu trữ zip và giải nén nó trong bộ nhớ bằng cách sử dụng PHP.Trong bộ nhớ tải xuống và giải nén lưu trữ zip

Đây là những gì tôi có ngày hôm nay (và nó chỉ là quá nhiều tập tin xử lý đối với tôi :)):

// download the data file from the real page 
copy("http://www.curriculummagic.com/AdvancedBalloons.kmz", "./data/zip.kmz"); 

// unzip it 
$zip = new ZipArchive; 
$res = $zip->open('./data/zip.kmz'); 
if ($res === TRUE) { 
    $zip->extractTo('./data'); 
    $zip->close(); 
} 

// use the unzipped files... 

Trả lời

8

Warning: Điều này không thể được thực hiện trong bộ nhớ - ZipArchive không thể làm việc với "bộ nhớ ánh xạ tập tin".

Bạn có thể lấy dữ liệu của một tập tin bên trong một zip-file vào một biến (bộ nhớ) với file_get_contentsDocs vì nó hỗ trợ các zip:// Stream wrapper Docs:

$zipFile = './data/zip.kmz';  # path of zip-file 
$fileInZip = 'test.txt';   # name the file to obtain 

# read the file's data: 
$path = sprintf('zip://%s#%s', $zipFile, $fileInZip); 
$fileData = file_get_contents($path); 

Bạn chỉ có thể truy cập các tệp với zip:// hoặc qua ZipArchive. Cho rằng trước tiên bạn có thể sao chép nội dung vào một tập tin tạm thời và làm việc với nó:

$zip = 'http://www.curriculummagic.com/AdvancedBalloons.kmz'; 
$file = 'doc.kml'; 

$ext = pathinfo($zip, PATHINFO_EXTENSION); 
$temp = tempnam(sys_get_temp_dir(), $ext); 
copy($zip, $temp); 
$data = file_get_contents("zip://$temp#$file"); 
unlink($temp); 
+0

Tôi có thể viết '$ zipFile = 'http: //..../bla.kmz';'? – dacwe

+0

Không, 'zip: //' chỉ hỗ trợ các tệp cục bộ cho đến nay (cũng như ZipArchive). Bạn phải có nó có thể truy cập thông qua hệ thống tập tin tiêu chuẩn của bạn. Sẽ cập nhật câu trả lời để hiển thị câu trả lời này cho url 'http' của bạn. – hakre

+0

Tính năng này có hoạt động với 'php: // memory' không? – dacwe

0

Bạn có thể nhận được một dòng vào một tập tin bên trong zip và giải nén nó vào một biến:

$fp = $zip->getStream('test.txt'); 
if(!$fp) exit("failed\n"); 

while (!feof($fp)) { 
    $contents .= fread($fp, 1024); 
} 

fclose($fp); 
+0

Làm thế nào tôi có thể tải về các tập tin và "ống" nó vào '$ zip'? – dacwe

0

Nếu bạn có thể sử dụng các cuộc gọi hệ thống, cách đơn giản nhất sẽ giống như thế này (trường hợp bzip2). Bạn chỉ cần sử dụng stdout.

$out=shell_exec('bzip2 -dkc '.$zip); 
2

Dễ dàng như:

$zipFile = "test.zip"; 
$fileInsideZip = "somefile.txt"; 
$content = file_get_contents("zip://$zipFile#$fileInsideZip"); 
Các vấn đề liên quan