2011-02-18 13 views
15

Al hacer clic en un botón, mi aplicación GWT devuelve un archivo PDF incrustado en una página HTML que será similar a:- GWT manera más fácil de hacer una pantalla de carga sencilla hasta el archivo se carga

<html><head></head> 
<body marginwidth="0" marginheight="0" bgcolor="rgb(38,38,38)"> 
<embed width="100%" height="100%" name="plugin" 
    src="http://myserver/?cmd=getMyPdf" type="application/pdf"> 
</body> 
</html> 

El problema es que puede Tómese un tiempo para que el servidor cree este archivo PDF, entonces lo que quiero es una pantalla de espera con una animación de carga que pueda tener la descarga del archivo PDF en segundo plano, y luego cuando el archivo esté listo, muestre la página como se describe arriba.

Una forma obvia sería mostrar una página de carga, enviar un comando asíncrono al servidor y luego, una vez que se llame al método onSucceed, llame a la página como siempre. Lo malo es que tendría que agregar algo de lógica del lado del servidor para hacer que la creación de PDF funcione en segundo plano ...

¿Hay alguna manera de hacer este lado del cliente con la API de GWT?

+0

Vaadin, una horquilla GWT, tiene algo como esto incorporado. Puede hacerlo con seguridad a través de js (jQuery, extJS o similar) –

+0

¿Desea mostrar la pantalla de espera hasta que A) el archivo esté completamente descargado, o B) solo hasta que la generación de PDF haya finalizado y el cliente comience la descarga? –

+0

@Chris: o bien está bien. – Epaga

Respuesta

7

¿Has visto esta pregunta sobre el stackoverflow Detect when browser receives file download? Básicamente, la respuesta que se da es que establece una cookie en la respuesta de retorno y espera en el lado del cliente para que se establezca esta cookie. Esto se puede hacer fácilmente con GWT ya que tiene un Programador (para la verificación del temporizador repetido) y un fácil acceso a las Cookies. Aún necesita hacer algunos cambios en el servidor, pero no tiene que crear un proceso en segundo plano.

+0

+1 Muy buen truco: D Para el lado de la presentación de las cosas, recomiendo mirar ['PopupPanel'] (http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google /gwt/user/client/ui/PopupPanel.html) o sus subclases, en lugar de implementar su propia :) o ['DialogBox'] (http://google-web-toolkit.googlecode.com/svn/javadoc/ 2.1/com/google/gwt/user/client/ui/DialogBox.html), si necesita algo más complejo. –

+0

Acabo de probar la solución, desafortunadamente no funcionó para mí (en Mac/Safari y Mac/Chrome): la cookie se establece justo al comienzo de la descarga, mucho antes de que el archivo haya terminado de descargarse. ¿Funcionó en tu sistema/navegador? –

+0

Aquí hay 2 fases. Primero la fase de generación, luego la fase de descarga. El problema aquí está relacionado con el primer problema: el tiempo necesario para generar el archivo pdf. La solución a la que hice referencia establece la cookie después de crear el pdf, justo antes de que comience la descarga. Normalmente, cuando comienza la descarga, los usuarios ven esto y saben que está funcionando, mientras que en la fase de generación no hay comentarios, por lo tanto, la solución para esa fase. –

5

no tengo la respuesta completa, pero el siguiente código funciona para mí en Safari, y tal vez se puede modificar, para que funcione con otros navegadores, también (?):

<html><head> 
<script type="text/javascript"> 
    function showPdf() { 
    document.getElementById("loading").style.visibility = "hidden"; 
    document.getElementById("pdf").style.visibility = "visible"; 
    } 
</script> 
</head> 

<body marginwidth="0" marginheight="0" bgcolor="rgb(38,38,38)"> 
    <div id="loading" 
    style="position: absolute; background-color: white;">Loading...</div> 

    <iframe id="pdf" width="100%" height="100%" name="plugin" 
    src="http://myserver/?cmd=getMyPdf" onload="javascript:showPdf();" 
     style="visibility: hidden;"></iframe> 
</body> 
</html> 

Esto es JavaScript puro, pero ciertamente podría hacerse con GWT también. Tenga en cuenta que estoy usando un iframe en lugar de embebido, porque embed no es realmente compatible con el método onload (y embed no es un elemento HTML estándar, por lo que recuerdo).

La razón, por qué esto no puede ser la respuesta completa, es que Chrome incendios el proceso de carga en cuanto el PDF inicia la descarga (pero después de la generación de PDF en el lado del servidor ha terminado). No estoy seguro, si esto es lo que quieres?

Cuestiones relacionadas