Foros del Web » Programando para Internet » PHP »

Generar archivos temporales

Estas en el tema de Generar archivos temporales en el foro de PHP en Foros del Web. Hola, Tengo una pàgina que me tiene que generar un archivo de texto para ser descargado y generar 2 informes al mismo tiempo. En principio ...
  #1 (permalink)  
Antiguo 27/10/2006, 07:39
 
Fecha de Ingreso: abril-2006
Mensajes: 76
Antigüedad: 18 años
Puntos: 0
Información Generar archivos temporales

Hola,

Tengo una pàgina que me tiene que generar un archivo de texto para ser descargado y generar 2 informes al mismo tiempo.

En principio pensé en utilizar headers() para que la salida fuera de texto y enviar el contenido del archivo de texto. Al mismo tiempo, abrir otra ventana (window.open) para que me mostrase los informes. Pero me resulta un poco cutrillo.

Me gustaría hacerlo de tal manera que el formulario genere 3 archivos temporales y mostrarlos con un icono de descarga, y al cerrar la sessión que se borren. No se como crear estos archivos y hacer que se borren posteriormente automaticamente. He leido que puedo hacer un fopen(), pero al hacer un fclose() se borra el archivo!!!

Saludos.
Yartax.
  #2 (permalink)  
Antiguo 27/10/2006, 07:56
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Me gustaría hacerlo de tal manera que el formulario genere 3 archivos temporales y mostrarlos con un icono de descarga, y al cerrar la sessión que se borren. No se como crear estos archivos y hacer que se borren posteriormente automaticamente. He leido que puedo hacer un fopen(), pero al hacer un fclose() se borra el archivo!!!
También puedes generar tres archivos en el servidor, generar un .ZIP de esos tres archivos y poner un link para descarga .. pero el borrado de esos archivos no será al instante sino por un proceso de borrado de archivos que se ejecute a intervalos de tiempo y bajo cierto criterio (tal vez fecha de creación del archivo).

El tema de control de esa acción por cerrar la sesión .. Si tu tienes un "logout" en tu aplicación y tus usuarios salen por ahí (por la "puerta") .. ahí si que puedes borrar (unlink()) tus archivos como quieras en ese instante, pero si te salen por "otro lado": cierran su ventana del navegador .. etc .. Ahí no tienes ningún control para ejecutar tu acción de borrado del archivo.

Creo que lo más sano si tienes N archivos a descargar es que los envies a descargar "en línea" (al vuelo) como ya lo haces con UNO actuamlente .. pero ahora genera un .ZIP (más que nada por el tema de que quedarían "compactos" más que del hecho de lo comprimido que queden ...) y lo entregas a descargar simplemente.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #3 (permalink)  
Antiguo 27/10/2006, 08:16
 
Fecha de Ingreso: abril-2006
Mensajes: 76
Antigüedad: 18 años
Puntos: 0
Entonces los pasos a seguir serian:
Crear archivo1.txt (temporal)
Crear archivo1.xls (temporal)
Crear archivo2.xls (temporal)
Añadir archivos a .ZIP
Utilizar headers() para indicar que es un archivo zip
Leer archivo zip y enviar datos (print)
realizar fclose de todos los archivos

Es así o existe algun problema a tener en cuenta?
  #4 (permalink)  
Antiguo 27/10/2006, 08:26
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por yartax Ver Mensaje
Entonces los pasos a seguir serian:
Crear archivo1.txt (temporal)
Crear archivo1.xls (temporal)
Crear archivo2.xls (temporal)
Añadir archivos a .ZIP
Utilizar headers() para indicar que es un archivo zip
Leer archivo zip y enviar datos (print)
realizar fclose de todos los archivos

Es así o existe algun problema a tener en cuenta?
No exactamente así ..

* Crear archivo1.txt (temporal) --> como archivo fisico en el servidor (con su fclose() y lo que corresponda)
* Crear archivo1.xls (temporal) --> como archivo fisico en el servidor (con su fclose() y lo que corresponda)
* Crear archivo2.xls (temporal) --> como archivo fisico en el servidor (con su fclose() y lo que corresponda)

* Añadir archivos a .ZIP --> Con ayuda de alguna classe para tal fin.
* Borrar los tres anteriores archivos creados.

* Utilizar headers() para indicar que es un archivo zip (la mayoría de classes que generan .zip te ayudan en este tema también) .. para que no tengas que generar un .zip físico .. sólo "al vuelo".

* realizar fclose de todos los archivos (ya los cerrastes indivualmente)

Puedes usar esta Classe para generar tus .ZIP:
http://www.phpconcept.net/pclzip/index.en.php

No sé si esta classe permitirá "añadir" archivos en forma de "string" (variables) y definir nombre que tendrá en el .ZIP .. pero si esto lo hace sería lo ideal .. así te evitas generar "físicamente" los archivos en el "disco" y luego tener que ir a borrarlos.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #5 (permalink)  
Antiguo 27/10/2006, 09:49
 
Fecha de Ingreso: abril-2006
Mensajes: 76
Antigüedad: 18 años
Puntos: 0
He hecho una prueba y me devuelve un zip sin archivos dentro, me puedes mirar esta prueba haber donde falla?
salida_zip( 'traspaso.zip' ); <- modifica headers tipo application/zip
$nom = tempnam( "/tmp" , "_");
$f = fopen($nom,"rw");
fwrite($f,"Cadena de texto del archivo");
fclose($f);
$zip = new PclZip('traspaso.zip');
if ( $zip->create( $nom ) == 0 )
die("error al añadir archivo");
print $zip;
unlink ( $nom );
  #6 (permalink)  
Antiguo 27/10/2006, 09:57
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 22 años, 3 meses
Puntos: 129
Cita:
Iniciado por yartax Ver Mensaje
He hecho una prueba y me devuelve un zip sin archivos dentro, me puedes mirar esta prueba haber donde falla?
salida_zip( 'traspaso.zip' ); <- modifica headers tipo application/zip
$nom = tempnam( "/tmp" , "_");
$f = fopen($nom,"rw");
fwrite($f,"Cadena de texto del archivo");
fclose($f);
$zip = new PclZip('traspaso.zip');
if ( $zip->create( $nom ) == 0 )
die("error al añadir archivo");
print $zip;
unlink ( $nom );
No he usado la classe que te recomiendo .. (no sé como se usa .. no me he leido su manual) .. Si lo estimas oportuno inicia un nuevo tema y pregunta sobre dicha classe concreta. Indica todo el código completo que uses.

Por cierto .. lo único que observo es que dices:
$nom = tempnam( "/tmp" , "_");

esa ruta con /tmp te refieres al "raiz" del servidor .. no uses eso .. a lo sumo:
/ruta/completa/sitio/tmp

ó

tmp/

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 01:35.