2011-02-02 39 views
11

Estoy creando un sistema para que las personas carguen archivos .tar (y .tar.gz, .tar.bz2, .zip, etc.) en PHP. Subir los archivos está bien, pero me gustaría enumerar los archivos contenidos en el archivo una vez que se haya cargado.¿Cómo puedo leer un archivo .tar.gz con PHP?

¿Alguien puede recomendar una buena biblioteca de PHP que pueda leer archivos de archivos?

Encontré File_Archive en Pear pero no ha sido actualizado en algunos años. ZipArchive funciona muy bien para archivos .zip, pero necesito algo que pueda manejar más tipos de archivos.

actualización estoy corriendo en RHEL6, PHP 5.2, 2.2 y Apache.

+0

¿Qué sistema operativo está ejecutando? – RobertPitt

+2

@RobertPitt RHEL6 significa Red Hat Enterprise Linux Versión 6 – Abadis

Respuesta

21

Usted puede hacer esto con la clase PharData:

// Example: list files 
$archive = new PharData('/some/file.tar.gz'); 
foreach($archive as $file) { 
     echo "$file\n"; 
} 

Esto funciona incluso con la envoltura phar:// corriente:

$list = scandir('phar:///some/file.tar.gz'); 
$fd = fopen('phar:///some/file.tar.gz/some/file/in/the/archive', 'r'); 
$contents = file_get_contents('phar:///some/file.tar.gz/some/file/in/the/archive'); 

Si usted no tiene Phar, verifique PHP-only implementation o the pecl extension.

+0

parece ser un problema con ciertos tipos de tar http://stackoverflow.com/questions/37189687/phardata-class-fails-when-tar-contents-has-relative-paths – artfulrobot

2

utilizar la extensión zlib

+0

¿La extensión zlib maneja los archivos TAR? – Michael

+1

No, solo maneja la compresión/descompresión de gz. Ya tiene mejores respuestas para manejar el lado del alquitrán de su problema. –

3

No intente construirlo usted mismo. Use una clase existente como http://pear.php.net/package/Archive_Tar para manejar eso por usted.

+0

¿Archive_Tar maneja archivos comprimidos? Y la documentación no dice que puede dar una lista de los archivos en un archivo .tar. No quiero extraer los archivos, solo quiero enumerar sus contenidos. – Michael

+1

@Michael: Sí, es compatible con la compresión .gz y .bz2. Y hay un método '-> listContent' entre otros. – mario

4

El siguiente código lee un archivo dentro de un archivo zip .gz

<?php 
    $z = gzopen('zipfile.gz','r') or die("can't open: $php_errormsg"); 
    $string = ''; 

    while ($line = gzgets($z,1024)) { 
     $string .= $line; 
    } 

    echo $string; 

    gzclose($z) or die("can't close: $php_errormsg"); 
    ?> 

Nota que es necesario tener la extensión zip de PHP habilitado para este código para trabajar.

+0

Excelente. Esto me ayudó. – anastymous

1

No creo que la primera respuesta funcione. O solo no funciona para mi No podías leer el contenido del archivo cuando lo intentabas. Doy mi código de trabajo a continuación.

$fh = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('phar:///dir/file.tar.gz'), RecursiveIteratorIterator::CHILD_FIRST); 
foreach ($fh as $splFileInfo){ 
echo file_get_contents($splFileInfo->getPathname()); 

Esto funciona para archivos gz, zip, tar y bz.

Cuestiones relacionadas