[como hacer esto][php] borrar archivos después de visualización en el cliente

Iniciado por LaThortilla (Effort), 15 Abril 2015, 23:28 PM

0 Miembros y 2 Visitantes están viendo este tema.

LaThortilla (Effort)

Buen dia..

Estoy tratando de generar un archivo 'directorio1/pagina.php'
y lo que quiero es que el contenido de pagina.php solo se visualice una ves y se borre...
main.php
Código (php) [Seleccionar]

 
  mkdir('directorio1');
  $contenido="<html><body><img src='./archivos/imagen1.png'/></body></html>";/*Esta imagen se creara tambien desde php pero eso ya lo tengo resuelto*/
  $fp=fopen("directorio1/pagina.php","w");
  fwrite($fp,$contenido);
  fclose($fp) ;
  header("Location: /directorio1/pagina.php");
  rmdir("directorio1");
 /*que debo hacer para borrar todo el directorio una ves el cliente obtenga todo el contenido*/

que debo hacer para borrar todo el directorio una ves el cliente obtenga todo el contenido?

Mod: no escribir en mayúsculas... hay herramientas para resaltar texto

MinusFour

No entiendo cual es el proposito de esto pero creo que rmdir necesita ejecutarse en pagina.php:

Código (php) [Seleccionar]

   <?php
   mkdir
('directorio1');
   
$contenido="<html><body><img src='./archivos/imagen1.png'/></body></html><?php rmdir('directorio1'); ?>
";/*Esta imagen se creara tambien desde php pero eso ya lo tengo resuelto*/
   $fp=fopen("directorio1/pagina.php","w");
   fwrite($fp,$contenido);
   fclose($fp) ;
   header("Location: /directorio1/pagina.php");
   ?>

LaThortilla (Effort)

Cita de: MinusFour en 16 Abril 2015, 17:25 PM
No entiendo cual es el proposito de esto pero creo que rmdir necesita ejecutarse en pagina.php:


1- Imagina una aplicación web que procesa una base de datos con imágenes... (es necesario convertir cada imagen codificada en "base64" a un archivo .jpeg).
¿por que? pues por que si intentas copiar una imagen que se muestre con base64, por alguna razón al pegar la selección en word no pega las imágenes solo el texto...

Y necesito liberar todo ese espacio una vez ya se encuentre en el cliente... es decir que ya este almacenada en la carpeta temporal del cliente...
(corrígeme si estoy mal)

2- si había pensado en esa solución pero me surgió la duda si borro las imágenes se alcanzaran a cargar en el cliente.. necesitaría como un listener que me diga que ya se cargo todo el contenido de la pagina resultante del proceso, junto con todas las imágenes...

Que me podrías sugerir?

MinusFour

No necesitas guardar la imagen en tu sistema de archivos puedes usar GD para desplegar la imagen directamente desde la base de datos.

WHK

Cita de: Effort en 22 Abril 2015, 21:34 PM
1- Imagina una aplicación web que procesa una base de datos con imágenes... (es necesario convertir cada imagen codificada en "base64" a un archivo .jpeg).
¿por que? pues por que si intentas copiar una imagen que se muestre con base64, por alguna razón al pegar la selección en word no pega las imágenes solo el texto...

Y necesito liberar todo ese espacio una vez ya se encuentre en el cliente... es decir que ya este almacenada en la carpeta temporal del cliente...
(corrígeme si estoy mal)

2- si había pensado en esa solución pero me surgió la duda si borro las imágenes se alcanzaran a cargar en el cliente.. necesitaría como un listener que me diga que ya se cargo todo el contenido de la pagina resultante del proceso, junto con todas las imágenes...

Que me podrías sugerir?

Las imagenes no se guardan en base64 dentro de una base de datos, provocas que al intentar indexar la columna termines agotando la memoria del servidor, para eso existen los campos de tipo blob aunque de todas maneras para almacenar imagenes se utilizan servidores estáticos o cdn y no base de datos, imagina si un millon de usuarios intentara solicitar imagenes, terminas con la base de datos abajo y sin portal, en cambio en un servidor de archivos puedes manejar caché entre otras cosas y no pasas por ninguna base de datos. Luego creas un cron que rastree y elimine todas las imagenes que tengan cierta edad aprovechando que los archivos tienen la propiedad de fecha de creación (por ejemplo los que tengan mas de 1 día).

De todas maneras hay una manera de entregar un archivo y eliminarlo pero te va a costar mucha CPU y se trata de que el usuario descargue el archivo solicitandolo a un script en php y este obtenga el archivo con fopen y recorra los bytes de a 2048 y al finalizar que cierre con un fclose y ejecute un "unlink()" el cual se encarga de eliminar el archivo. Es necesario agregar en la parte superior de ese script la opción de que no finalice al finalizar el navegador ya que si el usuario cancela la descarga no se ejecutará el eliminado del archivo, asi que pones esto:

ignore_user_abort(true);

Y eso hará que cuando yo cancele la descarga el servidor continuará con el código hasta llegar al unlink.

Pero como te vuelvo a decir... a menos que tengas un servidor con muchos núcleos y una velocidad considerablemente alta y varios balanceadores, no lo hagas, por último almacenalos y ve eliminandolos por fecha y si es posible no uses archivos, por ejemplo si deseas desplegar un captcha puedes generarlo con la librería GD y luego desplegarlo y listo, no necesitas guardar archivos:

http://php.net/manual/es/function.imagecreatetruecolor.php
https://github.com/mkoppanen/imagick/blob/master/examples/captcha.php

LaThortilla (Effort)

Cita de: WHK en 26 Abril 2015, 17:10 PM
Las imagenes no se guardan en base64 dentro de una base de datos, provocas que al intentar indexar la columna termines agotando la memoria del servidor, para eso existen los campos de tipo blob aunque de todas maneras para almacenar imagenes se utilizan servidores estáticos o cdn y no base de datos, imagina si un millon de usuarios intentara solicitar imagenes, terminas con la base de datos abajo y sin portal, en cambio en un servidor de archivos puedes manejar caché entre otras cosas y no pasas por ninguna base de datos. Luego creas un cron que rastree y elimine todas las imagenes que tengan cierta edad aprovechando que los archivos tienen la propiedad de fecha de creación (por ejemplo los que tengan mas de 1 día).

De todas maneras hay una manera de entregar un archivo y eliminarlo pero te va a costar mucha CPU y se trata de que el usuario descargue el archivo solicitandolo a un script en php y este obtenga el archivo con fopen y recorra los bytes de a 2048 y al finalizar que cierre con un fclose y ejecute un "unlink()" el cual se encarga de eliminar el archivo. Es necesario agregar en la parte superior de ese script la opción de que no finalice al finalizar el navegador ya que si el usuario cancela la descarga no se ejecutará el eliminado del archivo, asi que pones esto:

ignore_user_abort(true);

Y eso hará que cuando yo cancele la descarga el servidor continuará con el código hasta llegar al unlink.

Pero como te vuelvo a decir... a menos que tengas un servidor con muchos núcleos y una velocidad considerablemente alta y varios balanceadores, no lo hagas, por último almacenalos y ve eliminandolos por fecha y si es posible no uses archivos, por ejemplo si deseas desplegar un captcha puedes generarlo con la librería GD y luego desplegarlo y listo, no necesitas guardar archivos:

http://php.net/manual/es/function.imagecreatetruecolor.php
https://github.com/mkoppanen/imagick/blob/master/examples/captcha.php


Te diré exactamente a que base de datos me refiero... me refiero a la base de datos de whatsapp... almacena una previsualizacion de las imagenes compartidas.... y quiero hacer una pagina que subas esa base de datos y con un script de python extraer esas imagenes convertirlas en archivos y luego enviarlas al cliente y hacer lo que ya comentaba liberar todo ese espacio.... 

WHK

Watsapp no guarda las fotos y videos en la base de datos, watsapp usa Sqlite 3 y lo único que guarda son las rutas a los archivos porque los archivos están almacenados en la tarjeta de memoria principal en una carpeta llamada Watsapp/Media.

En ese caso lo que puedes hacer es mover el archivo a un directorio público temporal y que el mismo proceso verifique los directorios temporales que tengan mas de 1 hora de antiguedad.