2011-09-12 12 views
5

Chciałbym pobrać archiwum zip i rozpakować je w pamięci za pomocą PHP.W pamięci pobierz i rozpakuj archiwum zip

To co mam dzisiaj (i to jest po prostu zbyt dużo plików obsługi dla mnie :)):

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

Odpowiedz

8

Warning: To nie może być zrobione w pamięci - ZipArchive nie może pracować z "pamięci mapowane pliki".

można uzyskać dane z pliku wewnątrz plik zip do zmiennej (Pamięć) z file_get_contentsDocs gdyż wspiera 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); 

można uzyskać dostęp tylko pliki lokalne z zip:// lub poprzez ZipArchive. Do tego można najpierw skopiować zawartość do pliku tymczasowego i pracować z nim:

$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

Czy mogę napisać '$ zipFile = 'http: //..../bla.kmz';'? – dacwe

+0

Nie, 'zip: //' obsługuje tylko lokalne pliki do tej pory (jak również ZipArchive). Musisz to zrobić poprzez standardowy system plików. Zaktualizuje odpowiedź, aby była widoczna dla twojego adresu URL http. – hakre

+0

Czy działa z 'php: // memory'? – dacwe

0

można uzyskać strumień do pliku wewnątrz zip i rozpakować go do zmiennej:

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

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

fclose($fp); 
+0

Jak mogę pobrać plik i "rura" to do '$ zip'? – dacwe

0

Jeśli można użyć wywołań systemowych, najprostszy sposób powinien wyglądać następująco (przypadku bzip2). Po prostu używaj stdout.

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

Tak łatwe, jak:

$zipFile = "test.zip"; 
$fileInsideZip = "somefile.txt"; 
$content = file_get_contents("zip://$zipFile#$fileInsideZip"); 
Powiązane problemy