2011-01-10 24 views
13

Escribí este código para crear un archivo ZIP y guardarlo. Pero de alguna manera simplemente no muestra ningún error, pero tampoco crea un archivo ZIP. Aquí está el código:No hay error al crear zip, pero no se crea

$zip = new ZipArchive; 
$time = microtime(true); 
$res = $zip->open("maps/zips/test_" . $time . ".zip", ZipArchive::CREATE); 
if ($res === TRUE) { 
    echo "RESULT TRUE..."; 
    $zip->addFile("maps/filename.ogz","filename.ogz"); //Sauerbraten map format 
    $zip->addFromString('how_to_install.txt', 'Some Explanation...'); 
    $zip->close(); 
    $zip_created = true; 
    echo "FILE ADDED!"; 
} 

¿Qué estoy haciendo mal y cómo puedo solucionarlo?

+0

¿Los resultados 'RESULTADO VERDADERO' y 'ARCHIVO AGREGADO'? ¿Estás buscando en la carpeta correcta? ¿Tiene informes de errores habilitados?preguntas, preguntas: P – PeeHaa

+1

¿Ha comprobado que PHP tiene acceso de escritura a ese directorio? – alexn

+0

¡Nooo! : D alexn tenía razón! La secuencia de comandos no tenía suficientes derechos de acceso ... thx para resolver. Marcaría como respuesta correcta si lo publicará en breve ...? –

Respuesta

14

Probablemente apache o php no tienen permisos para crear archivos comprimidos en ese directorio. De uno de los comentarios en ZipArchice::open:

Si el directorio que está escribiendo o ahorro en no tiene la correcta conjunto permisos, no recibirá mensajes de error y que se verá como todo funcionaba bien ... excepto que no habrá cambiado!

En su lugar, asegúrese de recoger el valor de retorno de ZipArchive :: close(). Si es falso ... no funcionó.

Añadir una cláusula else a la sentencia if y volcar $ res para ver los resultados:

if($res === TRUE) { 
    ... 
} else { 
    var_dump($res); 
} 
+2

Se encontró con este problema en algún momento. Comprobar con is_writable() de antemano también ayuda ... en PHP realmente ayuda hacer eso antes de escribir, solo para estar seguro. – kander

+0

@alexn Me aseguré de tener permisos de escritura en mis directorios, sin embargo, el método close() me da FALSO. ¿Cómo debería hacer? Aparte de los permisos, ¿hay otras posibilidades? –

1

ruptura en pasos.

if ($res === TRUE) { 

    check if file_exist 

check if addFile give any error 
} 

if($zip->close()) 
{ 
$zip_created = true; 
    echo "FILE ADDED!" 
} 

Compruebe el phpinfo de cremallera está habilitado o no :)

5

Comprobar que cada uno de su archivo existe antes de llamar a $ zip-> addFile de lo contrario no se generará la cremallera y ningún mensaje de error se mostrará.

if(file_exists($fichier->url)) 
{ 
    if($zip->addFile($fichier->url,$fichier->nom)) 
    { 
     $erreur_ouverture = false; 
    } 
    else 
    { 
     $erreur_ouverture = true; 
     echo 'Open error : '.$fichier->url; 
    } 
} 
else 
{ 
    echo 'File '.$fichier->url.' not found'; 
} 
8

Hay 2 casos cuando zip no genera el error.

  1. Asegúrese de que todos los archivos que está agregando al zip sean válidos. Incluso si un archivo no está disponible cuando se llama al
    zip->close, el archivo fallará y no se creará su archivo comprimido.
  2. Si su carpeta no tiene tiene permisos de escritura zip no informará el error. Finalizará pero no se creará nada.
+0

¡Genial! en mi caso, necesito eliminar dos volcados DB después de agregar a ZIP, si los eliminé justo después del "$ zip-> addFile (...", así que cuando se llamó $ zip-> close() ¡Falló! Ahora estoy probando si $ zip-> close() devuelve verdadero, si es así, entonces elimino los volcados DB. – razor7

+0

Gracias, su opción 1 solucionó mi problema! –

4

Tuve exactamente el mismo problema, incluso cuando tenía permisos de escritura/lectura completos.

solucionado creando el archivo ".zip" manualmente antes de pasarla a ZipArchive:

$zip = new ZipArchive; 
$time = microtime(true); 
$path = "maps/zips/test_" . $time . ".zip" 

touch($path); //<--- this line creates the file 

$res = $zip->open($path, ZipArchive::CREATE); 
if ($res === TRUE) { 
    echo "RESULT TRUE..."; 
    $zip->addFile("maps/filename.ogz","filename.ogz"); //Sauerbraten map format 
    $zip->addFromString('how_to_install.txt', 'Some Explanation...'); 
    $zip->close(); 
    $zip_created = true; 
    echo "FILE ADDED!"; 
} 
+1

Vi este comportamiento también, pero al usar $ zip-> abrir ($ file, ZipArchive :: OVERWRITE). Usando un toque simplemente se sintió mal, encontré un comentario en http://php.net/manual/en/ziparchive.open.php por eric en webdeveric dot com, que sugería $ zip- > abrir ($ file, ZipArchive :: CREATE | ZipArchive :: OVERWRITE), que funciona, tanto para crear como para sobrescribir. – Anthony

+0

Yeeeeea, trabajado, muchas gracias – Husam

1

Una de las razones para el archivo zip no se crea que es debido a la falta de verificación si está agregando un archivo y no directorio.

if (!$file->isDir()) 

Encontré la solución here.

Cuestiones relacionadas