with texto strip_tags remove limpiar from eliminar allow all php

php - texto - borrando un archivo después de que el usuario lo descargue



string strip_tags (7)

Estoy usando esto para enviar el archivo al usuario

header(''Content-type: application/zip''); header(''Content-Length: '' . filesize($file)); header(''Content-Disposition: attachment; filename="file.zip"''); readfile($file);

Quiero eliminar este archivo después de que el usuario lo descargue, ¿cómo puedo hacer esto?

EDITAR: Mi situación es así, cuando el usuario pulsa el botón de descarga, mi secuencia de comandos creará un archivo zip temporal y el usuario lo descargará y ese archivo zip temporal se eliminará.

EDIT2: OK de la mejor manera parece ejecutar un trabajo cron que limpiará los archivos temporales una vez por hora.

EDIT3: Probé mi script con unlink , funciona a menos que el usuario cancele la descarga. Si el usuario cancela la descarga, el archivo zip permanece en el servidor. Así que eso es suficiente por ahora. :)

EDIT4: ¡GUAU! connection_aborted() hizo el truco!

ignore_user_abort(true); if (connection_aborted()) { unlink($f); }

Éste eliminará el archivo incluso si el usuario cancela la descarga.


Connection_aborted () nunca funcionó para mí. Pero ob_clean () funciona exactamente como debería. Espero que esto ayude a otros también

header(''Content-type: application/pdf''); header(''Content-Disposition: inline; filename="'' . $file . ''"''); header(''Content-Transfer-Encoding: binary''); header(''Accept-Ranges: bytes''); ob_clean(); flush(); if (readfile($file)) { unlink($file); }


La forma más segura que se me ocurre sería utilizar una película flash del lado del cliente que pueda observar la transferencia desde el lado del cliente y luego realizar una llamada XmlHttpRequest al servidor una vez que finalice la descarga.

AFAIK, no hay forma de hacerlo de manera confiable sin usar Flash (o un complemento de navegador similar)


No hay ninguna forma correcta de detectar si el usuario ha descargado completamente el archivo o no.
Así que la mejor manera será eliminar el archivo después de un período de inactividad.


No pude encontrar algo que funcionara para mí, así que se me ocurrió esto, que parece funcionar bien para mí:

header(''Content-type: application/zip''); //this could be a different header header(''Content-Disposition: attachment; filename="''.$zipName.''"''); ignore_user_abort(true); $context = stream_context_create(); $file = fopen($zipName, ''rb'', FALSE, $context); while(!feof($file)) { echo stream_get_contents($file, 2014); } fclose($file); flush(); if (file_exists($zipName)) { unlink( $zipName ); }

Espero que ayude a alguien


Siempre uso la siguiente solución:

register_shutdown_function(''unlink'', $file);


Yo también tengo una funcionalidad muy similar en uno de mi sitio web. Será como eliminar una carpeta y un archivo zip creados al azar después de cancelar la descarga. Intento explicarlo aquí, puede ser alguien que lo encuentre útil.

skin.php:
Esta página contiene un enlace de descarga como "http://mysite.com/downoload/bluetheme"

.htaccess:
Tengo la siguiente regla en el archivo htaccess para redirigir la solicitud de descarga a un archivo php. [download.php].

RewriteRule ^download/([A-Za-z0-9]+)$ download.php?file=$1 [L]

descargar.php:

include "class.snippets.php"; $sn=new snippets(); $theme=$_GET[''file'']; $file=$sn->create_zip($theme); $path="skins/tmp/$file/$file.zip"; $config_file="skins/tmp/$file/xconfig.php"; $dir="skins/tmp/$file"; $file.=".zip"; header("Content-type: application/zip"); header("Content-Disposition: attachment; filename=$file"); header("Pragma: no-cache"); header("Expires: 0"); readfile($path); //remove file after download unlink($path); unlink($config_file); rmdir($dir);

por lo tanto, a petición download.php creará un directorio con un nombre aleatorio usando la clase de fragmentos. Dentro del directorio se creará un archivo zip. Después de la descarga / cancelación de la solicitud, todos los archivos y el directorio serán eliminados.


unlink($filename);

Esto borrará el archivo.

Debe combinarse con los documentos ignore_user_abort()Docs para que el unlink aún se ejecute, incluso el usuario canceló la descarga.

ignore_user_abort(true); ... unlink($f);