Zumbe.net

Comenzando a programar una web

Crear archivos ZIP y TAR al vuelo con PHP (Directorio temporal)

Para solventar este problema podemos usar el directorio temporal del sistema, que siempre tiene permisos de escritura. Para obtener la dirección del directorio temporal podemos usar la variable $_ENV de esta forma:

Código: php
  1. <?php
  2. // Obtener el directorio temporal
  3. if (!empty($_ENV[‘TMP’])) {
  4.         $tempdir = $_ENV[‘TMP’];
  5. } elseif (!empty($_ENV[‘TMPDIR’])) {
  6.         $tempdir = $_ENV[‘TMPDIR’];
  7. } elseif (!empty($_ENV[‘TEMP’])) {
  8.         $tempdir = $_ENV[‘TEMP’];
  9. } else {
  10.         $tempdir = dirname(tempnam(, ‘na’));
  11. }
  12.  
  13. if (empty($tempdir)) { die (‘No hay directorio temporal’); }
  14.  
  15. // Nos aseguramos de que acabe en barra lateral
  16. $tempdir = rtrim($tempdir, ‘/’);
  17. $tempdir .= ‘/’;
  18.  
  19. // Nos aseguramos de que tiene permisos de escritura
  20. if (is_writable($tempdir) == false) {
  21.         die (‘El directorio temporal no tiene permisos de escritura’);
  22. }
  23. ?>

Como puedes ver en el ejemplo de arriba hay muchas variables diferentes que pueden contener el directorio temporal, y comprobamos cada una. también nos aseguramos de que el directorio acaba en una barra lateral y de que tenga permisos de escritura.

Ahora que podemos acceder al directorio temporal, tenemos que crear un directorio donde podamos almacenar de forma segura y temporal el archivo zip, sin interferencias. Así que comencemos:

Código: php
  1. <?php
  2. // Crear un nombre temporal para nuestro directorio
  3. $dir = tempnam($tempdir, ‘temp’);
  4.  
  5. // Nos aseguramos de que no hay otro archivo o directorio con ese nombre
  6. @unlink($dir);
  7. @rmdir($dir);
  8.  
  9. // Creamos el directorio
  10. mkdir($dir);
  11. $dir .= ‘/’;
  12. ?>

En el ejemplo anterior usamos la función tempnam() para crear un nombre temporal para nuestro directorio. A continuación nos aseguramos primero de que el nombre no está siendo usado, y después procedemos a crear el directorio.

Ahora que ya tenemos el directorio temporal, lvamos a asegurarnos de que nuestro archivo zip se crea correctamente ahí, cambiando el directorio de trabajo actual, con la función chdir(), de esta forma:

Código: php
  1. <?php
  2. // Cambiamos el directorio de trabajo actual para que el archivo zip se cree en el directorio temporal
  3. chdir($dir);
  4. ?>

El código completo tiene un aspecto como el siguente:

Código: php
  1. <?php
  2. include (‘pear/archive_zip.php’);
  3.  
  4. // Crear la instancia de la clase Archive_Zip e introducir el nombre de nuestro archivo zip
  5. $zipfile = New Archive_Zip(‘myzipfile.zip’);
  6.  
  7. // Crear una lista de archivos y directorios
  8. $list = array(‘example.txt’);
  9.  
  10. // Obtener el directorio temporal
  11. if (!empty($_ENV[‘TMP’])) {
  12.         $tempdir = $_ENV[‘TMP’];
  13. } elseif (!empty($_ENV[‘TMPDIR’])) {
  14.         $tempdir = $_ENV[‘TMPDIR’];
  15. } elseif (!empty($_ENV[‘TEMP’])) {
  16.         $tempdir = $_ENV[‘TEMP’];
  17. } else {
  18.         $tempdir = dirname(tempnam(, ‘na’));
  19. }
  20.  
  21. if (empty($tempdir)) { die (‘No hay directorio temporal’); }
  22.  
  23. // Nos aseguramos de que acabe en barra lateral
  24. $tempdir = rtrim($tempdir, ‘/’);
  25. $tempdir .= ‘/’;
  26.  
  27. // Nos aseguramos de que tiene permisos de escritura
  28. if (is_writable($tempdir) == false) {
  29.         die (‘El directorio temporal no tiene permisos de escritura’);
  30. }
  31.  
  32. // Crear un nombre temporal para nuestro directorio
  33. $dir = tempnam($tempdir, ‘temp’);
  34.  
  35. // Nos aseguramos de que no hay otro archivo o directorio con ese nombre
  36. @unlink($dir);
  37. @rmdir($dir);
  38.  
  39. // Creamos el directorio
  40. mkdir($dir);
  41. $dir .= ‘/’;
  42.  
  43. // Cambiamos el directorio de trabajo actual para que el archivo zip se cree en el directorio temporal
  44. chdir($dir);
  45.  
  46. // Crear el archivo zip
  47. $zipfile->create($list);
  48.  
  49. echo ‘Archivo zip creado en  ‘ . $dir;
  50.  
  51. ?>

Ahora sólo hay un problema. Como hemos cambiado el directorio de trabajo, las direcciones relativas no funcionarán. Lo más razonable que se nos viene a la cabeza es usar direcciones absolutas, pero esto tampoco funciona correctamente, debido a un fallo en el paquete Archive_Zip.

Arreglar las direcciones relativas

23 Octubre 2006 · Tags Sin categoría |

No hay comentarios, escribe el primero!

Escribe un comentario!

Buscador

2005-2007 Zumbe.net Creada por Alex Barros con WordPress - Licencia Reconocimiento - RSS