2009-10-06 20 views
7

Hemos estado buscando por un tiempo para obtener una respuesta a esto, pero no hemos encontrado una solución.Evento completo de descarga del navegador

Tenemos un servidor web, que permite al usuario descargar archivos (pdfs), que se generan dinámicamente y se sirven desde servlets. Nos gustaría saber cuándo se ha completado una descarga (y cómo: ¿tuvo éxito, falló, canceló el usuario?).

¿Hay alguna manera de saber esto sin la intervención del usuario? Estos archivos son relativamente pequeños, por lo que no se necesita una funcionalidad de barra de progreso, pero necesitamos algún tipo de "gancho final", que informa cuando la descarga ha finalizado. es posible?

[edit] ¿Qué capacidad habría en el lado del navegador que pueda detectar el final de la descarga e informar al servidor a través de ajax?

Respuesta

3

A menos que obtenga un error de red, no puede saberlo. La única forma es hacer que el navegador envíe un segundo evento al servidor (usando AJAX) para confirmar que la descarga se completó con éxito.

+2

¿Cómo sabría el navegador si la descarga se completa con éxito? Esa fue la esencia de mi pregunta, de hecho, voy a editar para que quede más claro – laura

+9

¿Por qué se aceptó esta respuesta? Todavía no sabemos cómo puede saber el navegador que la descarga se ha completado – abyx

+0

laura, ¿por qué le han otorgado esta respuesta?) – dnim

1

Aunque los archivos son pequeños, si utiliza el método setContentLength de ServletResponse, el usuario podrá distinguir entre un error y una buena descarga, y el administrador de descargas de su navegador les dirá cuándo está completo.

2

Cancelación del usuario puede a veces ser detectado en un servlet. Con Tomcat, por ejemplo, intente transmitir un archivo grande al cliente y luego cancele la descarga. Puede ver el stacktrace de la excepción en logs/catalona.out. No estoy seguro, sin embargo, de que esto se pueda manejar en servlet o en un nivel inferior (dentro de catalina).

Hay un enfoque de precarga (seguro con el agente de escucha de eventos instalación) que generalmente se usa para descargar imágenes. Depende del navegador descargar todo el PDF o no si lo detecta como una imagen no compatible, pero vale la pena intentarlo. Here es un ejemplo.

Otra solución sería descargar implícitamente el PDF usando las etiquetas <object> o <embed>, y utilizando su detector de eventos onload. No es que esto solo funcione si se hace un ActiveX o algún tipo de asociación de archivos PDF en el navegador, y probablemente no funcionará si el usuario no tiene un visor de PDF. Here es un ejemplo que demuestra esto (ver solución asistida: 11/21/04 08:22 AM, ID: 12638846).

Mohsen

6

Usted puede obtener una idea bastante buena desde el servidor que está conectado con el navegador directamente (el punto final de la conexión TCP). El servidor obtendrá un error IO cuando el usuario cancele la descarga o se encuentre con algún problema de red. Entonces, si puede ejecutar el servidor directamente (sin proxies). Se puede hacer algo como esto,

try { 
     response.setContentType("application/pdf"); 
     response.setContentLength(bytes.length); 
     ServletOutputStream ouputStream = response.getOutputStream(); 
     ouputStream.write(bytes, 0, bytes.length); 
     ouputStream.flush(); 
     ouputStream.close(); 
     logger.info("PDF " + fileName + " sent successfully"); 
    } catch (Exception e) { 
     logger.error("PDF " + fileName + " error: " + e.getMessage()); 
     throw e; 
    } 

Sin embargo, todavía hay una pequeña posibilidad de que el usuario no puede ver el PDF en el navegador después de la descarga con éxito. ACK del navegador será el mejor enfoque. No puede hacer eso si el PDF se muestra directamente en el navegador. Debe usar algún tipo de visor de PDF de Javascript y volver a agregar una llamada al servidor cuando se muestre.

0

Si usted puede insertar un campo de imagen en sus documentos, el href imagen puede señalar de nuevo a su servidor para confirmar que el usuario ha abierto el documento PDF.

No he intentado esto por mí mismo, pero mirando el last page of this adobe doc parece posible.

Si está utilizando Itext, no admite los campos de imagen, pero puede usar una plantilla en pdf con el campo de imagen para compilar sus documentos y agregar el javascript para asignar la url al campo de imagen.

Cuestiones relacionadas