Ver Mensaje Individual
  #8 (permalink)  
Antiguo 19/08/2008, 01:51
Avatar de HackmanC
HackmanC
 
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Mensaje Respuesta: como monitorear descarga de archivo, como saber si la descarga fue exitosa

Hola,

Muy interesante perspectiva de validación de descargas,
tal ves puedas implementar este algoritmo en una aplicación.

Escribes los HTTP headers adecuados Content-Type ... etc. (no confundir con HTML, por que no vas a generar HTML sino un octectstream/jpeg/png/flv/pdf/etc).
Abres el archivo en modo binario fopen() y transmites los bytes con fwrite() a php://output (o php://filter o con print()).
Al terminar de transmitir los bytes guardas el status de enviado (en una base de datos).
La proxima vez revisas si ya fué enviado antes de trasmitir nada.

Aunque no te asegura que los bytes hayan llegado a su destino, solamente que el servidor los envió (si el usuario cancela la descarga, PHP deja de transmitir y genera un error al no poder escribir en php://output y no llegaría al paso de guardar el status de enviado, inclusive podrías guardar la cantidad de bytes enviados hasta ese momento -- en php.net hay un ejemplo de como continuar las descargas fallidas -- con este método).

(Si no utilizas buffers ob_xxx, el proceso es light, solo trasmitir los bytes del archivo a la salida de php. Pero sí necesitas un buffer para leer fread() y escribir fwrite(), de 8 Kb o menos, como el socket está abierto manda de 8 en 8, y no hay problema con archivos de 200 Mb.)

Saludos,

ps:

Sí es posible descargar archivos con un applet en Java o un película en Flash, pero no obviar la seguridad (de otra forma cualquiera podría descargarte un virus por medio de Flash o Java, vas a necesitar un certificado digital).

No estoy diciendo que sea el mejor método, solamente que es el único que se me ocurren en PHP.
Ya lo probé .. pero que aburrido dártelo ya hecho no ?

Última edición por HackmanC; 19/08/2008 a las 02:48 Razón: buffers & cleanup & end.