2009-04-17 12 views
7

Tengo un servlet que escribe un archivo pdf como ByteArrayOutputStream en la secuencia de salida del servlet. Si abro la URL del servlet, el navegador abre el archivo. Pero si ocurre un error en el servlet, el navegador abre un pdf vacío con un mensaje de error. Enviando un error a través de ServletResponse, el navegador abre la página de error predeterminada.¿Cómo abrir un archivo usando JavaScript?

Deseo enviar un mensaje de error sin redireccionar a una página de error o abrir un archivo pdf no válido.

me trataron:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      docWindow = window.open('','title'); 
      docWindow.document.open('application/pdf'); 
      docWindow.document.write(response); 
      docWindow.document.close(); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

Pero, onSuccess abre una página con [object Object]

¿Cómo puedo abrir un archivo PDF utilizando JavaScript?

Respuesta

10

Nota: Estoy asumiendo que usted está utilizando el marco de la llamada Prototipo Ajax.Request.

El response object no está destinado a ser escrito directamente, pero sí tiene la propiedad responseText que debe contener el PDF devuelto.

Ha intentado:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      docWindow = window.open('','title'); 
      docWindow.document.open('application/pdf'); 
      document.write(response.responseText); 
      docWindow.document.close(); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

(Nótese el agregado .responseText)

Editar: Bueno, por lo que no funcionó ... intentar algo como esto:

new Ajax.Request('/pdfservlet', {    
     onSuccess: function(response) { 
      window.open('/pdfservlet'); 
     }, 
     onFailure: function(response) { 
      alert(response); 
     } 
    }); 

Lo que esto hará es crear la solicitud de ajax, y si tiene éxito, ábrala en una nueva ventana. La apertura de la nueva ventana debe ser rápida y, en realidad, no es necesario volver a solicitar el PDF, ya que el navegador debería haberlo guardado en caché durante la llamada Ajax.Request.

+0

esto no abre la aplicación pdf. abre una página con% PDF-1.6 % 1 0 obj <

+1

Agregué una nueva solución, es similar a lo sugerido por rde6173, pero se basa en el almacenamiento en caché del navegador. –

+0

el navegador no guarda en caché. el pdf es requerido dos veces –

2

Podría intentar un enfoque de "dos pasos". Utiliza el Ajax para llamar al servlet (y si genera un PDF sobre la marcha, haz que lo guarde en caché). Si tiene éxito, redirija al usuario al servlet con un parámetro para cargar el PDF en caché.

Existen otras opciones, pero dependen de cómo se usen los archivos PDF.

Mi $ 0,02 ..

0

Dado que parece que está enviando sus archivos PDF como "en línea" en lugar de "datos adjuntos", puede poner la URL del PDF en un marco flotante creado dinámicamente y luego adjuntar ese marco flotante a una superposición. Eso funcionaria.

-JP

0

Pero si ocurre un error en el servlet, el navegador abre un pdf vacía con un mensaje de error.

Me parece que sería mejor tratar de arreglar esto en el extremo del servidor que todo este frágil juguete con AJAX y cachés. ¿Por qué un error de servlet sigue configurando el encabezado 'Content-Type: application/pdf' con su mensaje de error? Verifique el orden de envío de las cosas en el servlet; no envíe el 'Tipo de contenido' hasta que haya creado el PDF correctamente y lo tenga listo para regresar.

+0

Puedo configurar el 'Tipo de contenido: texto/xml', pero ¿cómo puedo manejar esto en el lado del cliente? –

+0

¿Qué le parece simplemente configurarlo en text/html y publicar una página de error de aspecto agradable? Luego puede vincular el archivo y dejar que el navegador lo descargue o controle el error. Podría ser apropiado incluir un enlace de recarga "intentar nuevamente" si es el tipo de error que podría desaparecer en un segundo intento. – bobince

+0

Esto funciona, pero no quiero abrir una página de error. Quiero mostrar el error en la misma página. –

Cuestiones relacionadas