2009-04-07 19 views
8

Me preguntaba si había algún método para implementar el prompt del archivo de descarga del navegador usando JavaScript.Solicitud del archivo de descarga del navegador usando JavaScript

Mi razón: bueno, los usuarios subirán archivos a un servidor de archivos local al que no se puede acceder desde el servidor web. En otras palabras, ¡ambos estarán en diferentes dominios!

Por ejemplo, digamos sitios web alojados en www.xyz.com, pero los archivos residirían en un servidor de archivos local con dirección como \\10.10.10.01\Files\file.txt. ¿Cómo estoy cargando/transfiriendo archivos al servidor de archivos local ... usando ActiveX y VBscript! (no preguntes :-)

Así que estoy almacenando la ruta del archivo local en mi base de datos y vinculando esos datos a una grilla. Cuando el usuario hace clic en ese enlace, el archivo se abre en una ventana (usando JavaScript).

Problema es que ciertos tipos de archivos como texto, jpg, pdf, etc. se abren dentro de la ventana del navegador. ¿Cómo podría implementar content-type o content-disposition usando scripts de cliente? ¿Es eso posible?

EDITAR: el servidor de archivos local tiene una carpeta compartida de la ventana en la que se guardan los archivos.

+0

¿Qué tipo de servidor es su 'servidor de archivos local'? Un servidor HTTP/FTP/lo que sea o estás hablando de las carpetas compartidas de Windows (es decir, ¿quisiste decir '\\ 10.10.10.01' en lugar de' // 10.10.10.01'? – Christoph

+0

Es una carpeta compartida en Windows y en la ruta real a archivo sería '\\ 10.10.10.01 \ Files \ file.txt' – aix

+0

@aix: entonces no tiene suerte - no hay forma de enviar la metainformación adecuada a través de los encabezados HTTP – Christoph

Respuesta

5

"content-disposition: attachment" es prácticamente la única forma de forzar eso, y esto DEBE configurarse en el encabezado de respuesta.

+0

¿Cómo puedo configurarlo en el lado del cliente? ? Actualmente estoy usando javascript para abrir el archivo. Llamando a window.open ('\\ 10.10.10.01 \ Files \ file.t xt ') para abrir el archivo. Esto abriría el archivo en una ventana. ¿No es "content-disposition: attachment" una configuración de encabezado de respuesta del lado del servidor? – aix

+0

Como la pregunta decía "esto debe establecerse en el encabezado de respuesta", no puede establecerlo en el cliente. – Quentin

1

Puede intentar usar un hipervínculo común con type="application/octet-stream". Parece que funciona en FF, pero IE y Opera ignoran el atributo.

+0

Por especificación, IE y Opera tienen razón. El atributo de tipo dice "Esperar esto del servidor" para que los clientes que no entienden un tipo de contenido en particular puedan evitar molestarse en tratar de descargarlo (más útil con los bots).El verdadero tipo de contenido lo supera. – Quentin

+0

En mi opinión, IE y Opera están equivocados: en ausencia de cualquier otra información de tipo de contenido (que es el caso aquí), el 'navegador' debe respetar la "sugerencia de asesoramiento" (especificación de HTML) dada por el tipo atttribute; recuerde, el archivo no se envía a través de HTTP, por lo que no hay un campo Content-Type que pueda prevalecer sobre el atributo – Christoph

4

Si el archivo está alojado en un servidor web como en su ejemplo, se puede hacer:

window.location.replace(fileUrl); 

.. y el navegador se darán cuenta de qué hacer con el archivo. Esto funciona muy bien para la mayoría de los archivos, como .xls, .csv, etc., pero tenga en cuenta que esto no es a prueba total porque la configuración del controlador MIME del usuario determinará qué hacer con el archivo ... es decir, si es un archivo .txt lo más probable es que solo se muestre en el navegador y no se le dará un cuadro de diálogo de "descarga de archivos".

+0

Tenga en cuenta que esto significa que puede poner esto en la barra de direcciones: 'data: text/csv, a, b, c% 0ad, e, f' (esto crea una descarga de archivo CSV con 3 columnas y 2 filas). No estoy seguro de que esto esté en línea con la pregunta original, pero buscando en Google cómo crear ese aviso, terminé aquí. Tal vez ayude a los futuros lectores :) – Luc

3

A partir de agosto de 2015, agregar el atributo "descargar" a su etiqueta permite el comportamiento que está buscando, al menos en Chrome.

+1

Desafortunadamente, no es compatible con Cross-Origin en Firefox y no funciona en Safari, Edge e IE, ese hecho hace que el atributo de descarga sea inútil para mí: / – Sojtin

Cuestiones relacionadas