2011-09-12 20 views
5

zipアーカイブをダウンロードし、PHPを使用してメモリに解凍したいと思います。メモリ内にzipアーカイブをダウンロードして解凍する

// 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... 

答えて

8

警告:これは、メモリ内で実行することはできません - ZipArchiveはで動作することはできません「メモリマップファイル」。それはzip:// Stream wrapper Docsをサポートして

あなたはfile_get_contentsDocsを持つ変数(メモリ)へのzipファイル内のファイルのデータを取得することができます:あなたが唯一のzip://またはZIPARCHIVEを介してローカルファイルにアクセスすることができます

$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); 

。そのために、あなたは最初の一時ファイルに内容をコピーすることができますし、それに取り組む:あなたは、システムコールを使用することができた場合は、最も簡単な方法は、この(BZIP2ケース)のようになります

$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

'$ zipFile = 'http://..../bla.kmz';'を書くことができますか? – dacwe

+0

いいえ、 'zip://'はそれまでのローカルファイルだけでなく、ZipArchiveもサポートしています。標準的なファイルシステム経由でアクセス可能にする必要があります。あなたの 'http' URLのためにこれを見えるように答えを更新します。 – hakre

+0

'php:// memory'で動作しますか? – dacwe

0

あなたがたzip内のファイルへのストリームを取得し、変数にそれを抽出することができます。

これは私が(そしてそれは私のためにあまりにも多くのファイル処理です:))今日持っているものです。

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

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

fclose($fp); 
+0

私は '$のzip'にファイルや "パイプ" それをダウンロードすることができますどのように? – dacwe

0

。 stdoutを使うだけです。

のと同じくらい簡単
$out=shell_exec('bzip2 -dkc '.$zip); 
2

$zipFile = "test.zip"; 
$fileInsideZip = "somefile.txt"; 
$content = file_get_contents("zip://$zipFile#$fileInsideZip"); 
関連する問題