Foros del Web » Programando para Internet » PHP »

Borrar archivo del servidor tras su descarga

Estas en el tema de Borrar archivo del servidor tras su descarga en el foro de PHP en Foros del Web. Hola a todos. Tengo una web desde la que ciertos usuarios pueden descargarse archivos; el proceso es el siguiente : el archivo lo preparo para ...
  #1 (permalink)  
Antiguo 13/12/2009, 16:14
 
Fecha de Ingreso: agosto-2009
Mensajes: 6
Antigüedad: 14 años, 8 meses
Puntos: 0
Borrar archivo del servidor tras su descarga

Hola a todos.
Tengo una web desde la que ciertos usuarios pueden descargarse archivos; el proceso es el siguiente : el archivo lo preparo para su descarga dándole el nombre que me interese en una carpeta temporal, y cuando el usuario hace click en el botón "descarga" se ejecuta un script php que se lo envía ("headers" y luego "fpassthru"); lo que quiero es que ese archivo se borre tras su descarga y no sé cómo hacerlo. Ya sé que borrar es "unlink", pero el caso es que habría que comprobar primero que se ha descargado por completo, y luego borrarlo. He iniciado las pruebas poniendo el "unlink" inmediatamente después del "fpassthru", pero no hace nada. ¿Alguien con más experiencia que yo en estos temas me echa una mano?. Muchas gracias.
  #2 (permalink)  
Antiguo 13/12/2009, 16:20
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 15 años
Puntos: 1517
Respuesta: Borrar archivo del servidor tras su descarga

¿Por qué tienes que crear el archivo en tu servidor? Te pregunto porque lo más probable es que haya alguna forma de lo puedes hacer que con los header lo descargues sin tener la necesidad de crear el archivo.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #3 (permalink)  
Antiguo 13/12/2009, 17:35
Avatar de bacdavi  
Fecha de Ingreso: junio-2006
Ubicación: http://localhost/
Mensajes: 351
Antigüedad: 17 años, 11 meses
Puntos: 7
Exclamación Respuesta: Borrar archivo del servidor tras su descarga

Proba esto a ver si te existe...

Código PHP:
if(file_exists($archivo)){
    
unlink($archivo);

  #4 (permalink)  
Antiguo 13/12/2009, 17:59
 
Fecha de Ingreso: agosto-2009
Mensajes: 6
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Borrar archivo del servidor tras su descarga

Hola, gracias por responder tan rápido. Lo hago por ciertos motivos de seguridad, es algo largo de explicar; durante ese proceso renombro el archivo y le hago algunas "jugadas" más. En definitiva, funciona lo que quiero hacer, que es lo importante. Mi problema es borrarlo después de que se transfiera al usuario que lo solicita. Agradecería mucho algo de ayuda sobre eso. Mil gracias.
  #5 (permalink)  
Antiguo 13/12/2009, 18:39
Avatar de bacdavi  
Fecha de Ingreso: junio-2006
Ubicación: http://localhost/
Mensajes: 351
Antigüedad: 17 años, 11 meses
Puntos: 7
Respuesta: Borrar archivo del servidor tras su descarga

ya te lo he respondido arriba amigo, revisalo...
  #6 (permalink)  
Antiguo 14/12/2009, 03:01
Avatar de urgido  
Fecha de Ingreso: febrero-2005
Mensajes: 2.351
Antigüedad: 19 años, 2 meses
Puntos: 25
Respuesta: Borrar archivo del servidor tras su descarga

bueno para eso estaria bueno que te crearas un contador con javascript

de lo contrario no sé si te funcione como último que pongas la función unlink($RUTA); justo abajo de donde hacer el echo del $file; desconozco si te funcione pero podría. Saludos
__________________
Hospedaje Web al mejor costo!
  #7 (permalink)  
Antiguo 27/12/2009, 18:43
 
Fecha de Ingreso: agosto-2009
Mensajes: 6
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Borrar archivo del servidor tras su descarga

Hola, por si a alguien le puede servir, os comento que al final lo he resuelto usando la función register_shutdown_function, que, en todas las pruebas que estoy haciendo, parece funcionar. Ni sabía que existía esa función, la encontré de casualidad buscando otros asuntos de php y me vino perfecta. De hecho, quiero comprobar muy bien que hace lo que yo quiero y nada más, porque de verdad que no estoy seguro del todo de cómo trabaja.
Gracias por todo, y cualquier comentario/corrección sobre esto será por supuesto bienvenido.
Saludos a todos.
  #8 (permalink)  
Antiguo 03/03/2010, 05:39
 
Fecha de Ingreso: agosto-2009
Mensajes: 6
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Borrar archivo del servidor tras su descarga

Pongo el código que usé. Es un poco chapuza, y lo reconozco, pero me vale. Éste es el trozo de código que descarga el archivo al ordenador del usuario que lo solicita. Como se ve, primero se recibe el archivo y el directorio (por un tema de diseño específico de esa web, en otro caso sería distinto), preparo la ruta en la que está (de nuevo esto dependerá de la ruta en la que esté el arcvhivo), lo abro, lo transmito y es entonces cuando paso mi función "borrado" por register_shutdown_function(). Por las pruebas que hice y lo que pude averiguar, con esto consigo que no se ejecute la función "borrado" hasta que el archivo "$archivo_a_borrar" haya terminado de "salir" del servidor.
Esto me causó un "efecto colateral", y es que me añadía unos número, a mi entender aleatorios, al comienzo del nombre del archivo, y no he tenido tiempo de investigarlo más a fondo, aunque lo haré. No sé si te ocurrirá siempre lo mismo. El caso es que funciona muy bien.
Código PHP:
<?php
error_reporting
(0);
$f $_POST['archiv'];
$ruta $_POST['directorio'];
$ruta '../../'.$ruta;
$ruta $ruta.'/';
header("Content-type: application/octet-stream");
header("Content-Disposition: attachment; filename=\"$f\"\n");
$fp=fopen($ruta."$f""r");
fpassthru($fp);
register_shutdown_function("borrado");
 

function 
borrado(){
  global 
$fp,$f;
  
$ruta $_POST['directorio'];
  
fclose($fp);
  
$archivo_a_borrar="/wamp/www/".$ruta."/".$f;
  
unlink($archivo_a_borrar);
}
?>
Suerte, espero que le sirva a laguien.
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.
Respuesta

SíEste tema le ha gustado a 1 personas




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