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);
}
}
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:
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.