2009-04-07 12 views
7

Estoy buscando más ideas sobre la mejor manera de iniciar una descarga de archivos desde Javascript.¿Iniciando una descarga de archivos que funciona bien, incluso en IE?

Best way to initiate a download? tiene un montón de buenas ideas que pueden resumirse:

  • Establecer el SRC en un iframe
  • Uso window.location.replace()
  • Usar una página con un encabezado meta de actualización
  • Utilice un window.open()
  • Deje el archivo directamente salida del servidor, estableciendo el Content-Type y Content-Disposition

Todos estos enfoques funcionan bien para los navegadores con los que he estado probando, excepto para IE8. Con IE8, consigo un montón de problemas:

  • El marco flotante no está funcionando debido cookies creadas por el ambiente que estoy usando. Creo que tendría que habilitar los encabezados P3P para resolver esto, pero el entorno no me permite establecer encabezados, por lo que P3P está fuera
  • El window.location.replace() funciona excepto que en IE8, el la barra de dirección de la ventana cambia a la URL del archivo y la ventana subyacente está en blanco después de abrir el archivo descargado
  • El enfoque de actualización de meta también funciona, pero la barra de direcciones cambia a la URL del archivo y al ventana subyacente está en blanco después de las descargas de archivos
  • Estoy tratando desesperadamente de evitar window.open() a esquivar cualquier bloque emergente ker problemas
  • El entorno de servidor que estoy en que no permitirá la salida del archivo en sí, al igual que usted podría hacer en, por ejemplo, objeto de respuesta de ASP.NET

ni siquiera he intentado estos métodos con IE6 o IE7, por lo que puede haber otras sorpresas allí.

Entonces, ¿alguien tiene alguna otra sugerencia para iniciar una descarga en IE, donde (1) no hay ventanas emergentes involucradas y (2) el archivo se puede guardar o abrir y (3) no se deja ninguna ventana en blanco, (3) usando solo Javascript, HTML y una URL para un archivo?

de Denver, Mike

+0

¿Podría explicar el entorno del servidor? –

+0

Hola Joel, Esto se está creando para ejecutarse en los servidores de Salesforce.com; tienen su propio lenguaje de programación llamado Apex. –

Respuesta

5

El patrón habitual de una página de descarga de archivos (si usted debe tener uno; personalmente los odio) es o bien:

<script type="text/javascript"> 
    window.onload= function() { 
     window.location= document.getElementById('downloadlink').href; 
    } 
</script> 
<p> 
    Your download will begin shortly. If it doesn't, 
    <a id="downloadlink" href="file.zip">click here</a>. 
</p> 

O lo mismo con un meta-refresh vez del guion De cualquier manera, debería comportarse de manera similar.

El enfoque meta de actualización también funciona, pero aún así la barra de direcciones cambia a la dirección URL del archivo y la ventana subyacente es en blanco después de las descargas de archivos

Eso no debería suceder. ¿Hay una versión en línea que pueda ser probada? Normalmente, cuando el navegador se transfiere directamente a un archivo mediante cualquier método normal (clic de enlace, ubicación.href, meta-actualización), debe mantener la página anterior en pantalla.

el medio ambiente no permite que fije las cabeceras, por lo que está fuera de P3P

Usted no tiene que utilizar los encabezados para establecer políticas P3P, un enlace HTML <> etiqueta funciona igual de bien :

<link rel="P3Pv1" href="/policy.p3p" /> 

¿Pero por qué lo necesitarías? Si la URL objetivo solo está publicando un archivo, no hay necesidad de establecer una cookie, entonces ¿para qué molestarse con P3P?

Estoy tratando desesperadamente de evitar window.open() para esquivar los problemas bloqueo de ventanas emergentes

Si window.open() en respuesta a un clic del usuario, no hay emergente problemas de bloqueador

No es necesario abrir una ventana emergente solo para descargar un archivo de todos modos. Estoy empezando a pensar que hay algo muy extraño sobre el destino de descarga de archivos al que se está vinculando, como que no se trata de una descarga de archivos, sino de algún tipo de aplicación web HTML extraña. Vincular a una descarga no es difícil, solo tiene que vincular el archivo, el trabajo realizado; parece que estás haciendo esto mucho más difícil de lo que intrínsecamente es.

El único problema habitual con solo vincular un archivo es que si contiene texto, HTML, XML o una imagen, el navegador lo mostrará en línea en lugar de descargarlo. La única forma de vencer esto es usar el encabezado 'Content-Disposition: attachment', ya sea sirviéndolo a través de un script que establece este encabezado, o configurando su servidor web para enviar ese encabezado para todas las descargas de archivos. Si no puede hacer ninguno de esos en su entorno de servidor, no hay solución.

+0

Muchas gracias por sus comentarios detallados y excelentes consejos. Decidí simplemente proporcionar un enlace para descargar el archivo y funciona muy bien en todos los navegadores y evita toda esta complicación. –

Cuestiones relacionadas