2011-09-12 6 views
5

Je voudrais télécharger une archive zip et décompressez-la en mémoire en utilisant PHP.En mémoire télécharger et extraire l'archive zip

C'est ce que j'ai aujourd'hui (et il est juste trop fichier de traitement pour moi :)):

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

Répondre

8

Avertissement: Cela ne peut pas être fait en mémoire - ZipArchive peut ne pas fonctionner avec « fichiers mémoire mappée ».

Vous pouvez obtenir les données d'un fichier dans un fichier zip dans une variable (mémoire) avec file_get_contentsDocs car il supporte le 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); 

Vous ne pouvez accéder aux fichiers locaux avec zip:// ou via ZipArchive. Pour cela, vous pouvez d'abord copier le contenu dans un fichier temporaire et travailler avec elle:

$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

Puis-je écrire '$ zipFile = 'http: //..../bla.kmz';'? – dacwe

+0

Non, 'zip: //' ne prend en charge que les fichiers locaux (ainsi que ZipArchive). Vous devez l'avoir accessible via votre système de fichiers standard. Mettra à jour la réponse pour la rendre visible pour votre URL 'http'. – hakre

+0

Fonctionne-t-il avec 'php: // memory'? – dacwe

0

Vous pouvez obtenir un flux à un fichier dans le zip et l'extraire dans une variable:

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

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

fclose($fp); 
+0

Comment puis-je télécharger le fichier et "pipe" à la 'zip' de $? – dacwe

0

Si vous pouvez utiliser les appels système, la façon la plus simple devrait ressembler à ceci (bzip2 cas). Vous utilisez simplement stdout.

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

Aussi facile que:

$zipFile = "test.zip"; 
$fileInsideZip = "somefile.txt"; 
$content = file_get_contents("zip://$zipFile#$fileInsideZip"); 
Questions connexes