2009-05-07 17 views
5

Necesito una solución de navegador cruzado para el siguiente caso de uso: El usuario hace clic en un botón "exportar" en una de nuestras páginas, que abre una ventana emergente con un formulario. Al enviar el formulario, el usuario debe recibir una descarga de archivo binario (un archivo CSV, por ejemplo), y la ventana emergente debe cerrarse sin cambiar el contenido visible de la ventana principal.¿Cómo proporcionar (en IE y Firefox) una descarga de archivo binario en una ventana emergente que se cierra?

No podemos utilizar un tiempo de espera para cerrar la ventana emergente, porque generalmente hay un cuadro de diálogo que le pregunta al usuario cómo manejar el archivo antes de descargarlo, y no hay forma de saber cuánto le tomará al usuario manejar este diálogo .

Originalmente teníamos un script en la ventana emergente que establece window.location en la URL del archivo de descarga. Eso deja la ventana emergente sin cerrar.

Así que traté de poner un iFrame oculto en la ventana principal y tener la ventana emergente establecer iFrame's src en la URL de descarga antes de llamar a self.close(). Eso funciona perfectamente en Firefox, pero IE lo destruye por completo con restricciones de seguridad.

¿Hay una forma correcta de hacerlo? ¿Qué tal una forma que funciona en IE?


Actualización - problema resuelto

Las respuestas que aquí se proponen no fueron demasiado lejos, pero mi problema era un poco más complejo que simplemente ser una cuestión Javascript. Encontré errores con IE y Excel (ya que el archivo de descarga es CSV) y la ventana emergente estaba haciendo una publicación de formulario.

No pude resolver el problema sin anexar los datos del formulario a una URL (para un GET en lugar de un POST) y tengo que configurar el sitio como confiable en IE (esta es una aplicación empresarial, eso es razonable solicitud de hacer de los usuarios).

Al hacer clic en el botón de formulario, la ventana emergente llama a una función en window.opener, pasando el formulario y su URL de acción. Luego, la ventana emergente llama a window.close(). La función agrega los datos del formulario a la URL y establece window.location a la nueva URL (la idea de iFrame nunca funcionó bien en IE y aparentemente no fue necesaria).

En la respuesta a la URL del formulario, los encabezados de solicitud incluyen Content-Type: application/octetstream y Content-Disposition "," attachment; archivo = filename.csv".

+0

¿Funcionaría ya sea para poner el formulario en la página original o dirigir la nueva página para abrir en un iframe (que podría generarse desde el script)? – Anonymous

+0

En respuesta a Anonymous: creo que lo que describes es algo así como lo que hice. La ventana emergente, en la creación y carga inicial, en realidad escribe un iFrame invisible en la página principal. Cuando se envía el formulario en la ventana emergente, ordena al iFrame que cargue el archivo de descarga. Mi IE (IE 6) bloqueó esto y me obligó a confirmar la descarga en la ventana principal. En la confirmación, intenta volver a enviar el formulario de ventana principal, lo que abre otro cuadro de diálogo de confirmación y generalmente lo desordena. –

+0

Estaba pensando en enviar el formulario a un iframe, que elimina el problema persistente emergente. – Anonymous

Respuesta

0

Ésta podría ser la manera de abordar el problema.

1) forma emergente onsubmit hace un window.open para una tercera ventana que se abre una página que es una página en blanco que simplemente devuelve el archivo descargado.

2) en su javascript en forma emergente, justo después de hacer el window.open, llamar al método que se cierra la ventana emergente Envíe el formulario de la ventana de su padre (la primera ventana).

3) En la tercera página, que es solo la página que devuelve el archivo, la disposición del contenido en el archivo de encabezado solo devuelve el archivo y noth En otra cosa, la página no se abrirá realmente.

Aquí hay alguna información sobre el encabezado que pueda necesitar. El código está en ASP prehistórico clásico, pero debería ser capaz de brillar lo que necesita.

http://classicasp.aspfaq.com/general/how-do-i-prompt-a-save-as-dialog-for-an-accepted-mime-type.html

Espero que ayude.

+0

No estoy seguro de que el paso 1 funcione en mi caso, porque el envío del formulario en la ventana emergente genera realmente el archivo que se va a descargar y lo nombra. Hasta que obtenga los resultados de este envío, no puedo abrir la tercera ventana porque no conozco la URL de descarga. Ese es un problema que se puede solucionar, pero esperaba no tener que tocar el servlet de descarga de archivos en sí, ya que esta es una corrección de errores al final de nuestro ciclo de desarrollo. –

1

¿Ha intentado, en la solución iframe, realmente llamar a un método dentro de la ventana principal, que a su vez establecerá la ubicación del iframe? Lo digo porque funcionó en mis pruebas:

ventana padre

<html> 
<head> 
<script type="text/javascript"> 
var w; 

var download = function() { 
    document.frames[0].location = "test.php"; 
    w.close(); 
}; 

var o = function() { 
    w = window.open("test2.html", "window_name"); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return o();">open</a> 

<iframe></iframe> 

</body> 
</html> 

ventana emergente

<html> 
<head> 
<script type="text/javascript"> 
var download = function() { 
    window.opener.download(); 
    return false; 
}; 
</script> 
</head> 
<body> 

<a href="#" onclick="return download();">download</a> 

</body> 
</html> 

prueba.php es sólo una página que obliga a un archivo para descargar, y tenga en cuenta que el código anterior es específico de IE ya que estoy usando el objeto document.frames, pero se puede hacer fácilmente entre navegadores.

+0

En el momento de la generación de la página principal, no se conoce la URL de descarga del archivo. Supongo que podría pasarse a la función de descarga(). Tendré que probar esto (a principios de la próxima semana, debido a mi agenda). –

+0

Poner la función de descarga() en el abridor no solucionó las cosas. IE todavía bloquea y destroza completamente el proceso de descarga. El siguiente paso para mí es intentar cargar el formulario en el iFrame en lugar de en el menú emergente. –

+0

¿Qué versión de IE? –

-1

No hay ninguna solución perfecta para ello. Cuando se descarga un archivo en IE, aparece su ventana emergente y en firefox se descarga directamente

Cuestiones relacionadas