es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La función de descompresión de PHP no incluye subcarpetas.

He estado intentando crear una aplicación en PHP para descomprimir archivos, pero estoy teniendo dificultades con los subdirectorios. Cuando intento subir un archivo ZIP sin subcarpetas, solo con archivos/carpetas, funciona bien, y un archivo ZIP con una carpeta que no contiene subcarpetas funciona correctamente. Pero cuando las carpetas contienen subcarpetas con archivos, el archivo ZIP no se carga. Estoy usando PHP 7.4 y otro ejemplo que encontré no funciona con esta versión.

.zip1 /files/ funciona correctamente

.zip2 /carpeta/archivo funciona correctamente

.zip3 /carpeta/subcarpetas/archivo no funciona (hace que la aplicación falle, sin errores)

Este es el código básico que estoy intentando aplicar en mi aplicación:

// Subir a esta ruta
$target_path = "a/1/" . $folder . "/" . $filename;

// Obtener la solicitud del formulario
$source = $_FILES["zip_file"]["tmp_name"];

if(move_uploaded_file($source, $target_path)) {
    $zip = new ZipArchive();
    $x = $zip->open($target_path);
    if ($x === true) {
        $zip->extractTo("a/1/" . $folder . "/");
        $zip->close();

        unlink($target_path);
    }
}
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Basado en la información proporcionada, parece que hay un problema al descomprimir archivos que contienen subdirectorios al usar el código proporcionado en PHP 7.4. El código primero carga el archivo zip en una ruta específica y luego utiliza la clase ZipArchive para extraer el contenido del archivo zip en la misma ruta.

    Una solución a este problema podría ser modificar el código para extraer de forma recursiva cualquier subdirectorio y archivo dentro del archivo zip. Esto se puede lograr utilizando los métodos de ZipArchive getNumFiles() y getNameIndex() para iterar a través de los archivos y directorios dentro del archivo zip, y luego usar el método isDirectory() para determinar si el elemento es un archivo o un directorio. Si es un archivo, puede ser extraído utilizando el método extractTo(). Si es un directorio, se puede crear un nuevo directorio y repetir el mismo proceso para el contenido de ese directorio.

    Aquí hay un ejemplo de cómo se podría implementar esto:

    //cargar en esta ruta
    $target_path = "a/1/".$folder."/".$filename;
    
    //verificar si el archivo se cargó correctamente
    if(move_uploaded_file($_FILES["zip_file"]["tmp_name"], $target_path)) {
    
        //abrir archivo zip
        $zip = new ZipArchive();
        $zip->open($target_path);
    
        //iterar a través de archivos y directorios en el archivo zip
        $num_files = $zip->getNumFiles();
        for($i = 0; $i < $num_files; $i++) {
            $file_name = $zip->getNameIndex($i);
    
            //verificar si el elemento es un directorio
            if($zip->isDirectory($file_name)) {
    
                //crear nuevo directorio y extraer de forma recursiva su contenido
                $new_dir = "a/1/".$folder."/".$file_name;
                mkdir($new_dir);
                $sub_zip = new ZipArchive();
                $sub_zip->open($target_path);
                $sub_zip->extractTo($new_dir, $file_name . "/");
                $sub_zip->close();
    
            } else {
    
                //extraer archivo en la ruta objetivo
                $zip->extractTo("a/1/".$folder."/", $file_name);
    
            }
        }
    
        //cerrar archivo zip y eliminar el archivo zip cargado
        $zip->close();
        unlink($target_path);
    }
    

    Este código modificado debería ser capaz de manejar archivos zip con subdirectorios y extraer todos los archivos y directorios de forma recursiva en la ruta objetivo.

Comments are closed.