Forzar descarga de archivo.
3 seguidores
Esa gente,
¿Alguien conoce algún metodo por el cual se pueda forzar a un archivo a descargarse en el ordenador del cliente en lugar de abrirse en el navegador?.
Espero podais ayudarme.
Gracias.
Esa gente,
¿Alguien conoce algún metodo por el cual se pueda forzar a un archivo a descargarse en el ordenador del cliente en lugar de abrirse en el navegador?.
Espero podais ayudarme.
Gracias.
Seguro que tienes mucho que decir, te estamos esperando.
orange
Pues va a depender del tipo de archivo ¿que es exactamente lo que quieres hacer?.
Me imagino que si posteas es que será alguno que abre directamente el navegador, como html, pdf, doc o algo asi.
Cuéntame un poco más cómo es la cosa, y trato de enterarme a ver cómo se puede hacer.
Juanma
Veras el tema es este se trata de una zona de descarga donde basicamente se van a alojar documentación (pdf. doc. xls. etc...) la mayoria de estos se abren automaticamente en el navegador.
He intentado hacerlo mandando un encabezado http con el tipo MIME utilizando ASP (idea que me proporcionó Josh "PROGRAMACIÓN SERVIDOR") pero tengo un problema con los pdf y es que utilizan caracteres reservados de ASP y el servidor intenta ejecutarlos.
Para complicar un poco mas la cosa los archivos se encuentra en un directorio restringido, por lo que seria interesante poder entrar en el registrado previamente ocultando los datos al cliente.
Espero haberme explicado bien,
Muchas Gracias por tu tiempo.
orange
Puff! de lo que te cuento no tengo claro totalmente nada, pero voy a mirártelo ...
En un principio pensé en una función que tiene php para comprimir en gzip, podrías comprimir los archivos y, además de no abrirlos, ocupan menos. Pero no la he probado nunca, ni sé si ASP tiene algo parecido.
Lo del directorio no me ha quedado muy claro, tienes los archivos en un directorio restringido, y quieres ocultar los datos de dicho directorio a los usuarios que se bajen los archivos ¿no?, supongo para que no pasen el link a otros.
Tengo que pensarlo también, porque me imagino que por muchas vueltas que le des para ocultar los enlaces, al final el tio hará una descarga, y eso queda registrado en su equipo (máxime si utiliza un gestor de descargas).
Ese es un problema que me preocupa, porque tengo que hacer una cosa parecida, todavía hay que darle vueltas.
Pero lo que yo creo es que si una persona tiene acceso legal al directorio y se baja un archivo, si quiere darselo a alguien le pasará directamente el archivo, y no el link.
Porque si le pasa el link no puede hacer nada con él, ya que tu directorio está restringido.
En un principio pensé en poner todas las trabas posibles para ocultar la ruta al archivo, poniendo además mi propio sistema de registro de usuarios, de forma que no les sea fácil pillar el link. Y proteger también el directorio mediante http, de forma que si consiguen la ruta, no les sea posible acceder al archivo directamente.
Pero es una primera idea, si quieres le damos más vueltas.
Voy a ver si me entero de algo por otro lado, dame un rato ;)
Juanma
No me preocupa que el cliente pueda ver la URL del archivo ya que el directorio esta protegido, lo que no quiero es que pueda conseguir cualquier dato referente a la identificación como usuario ya que este directorio contiene otros archivos a los que no debería tener acceso.
De momento solo he encontrado una manera de enviar datos de autenticación, sería a traves de ftp, ya sabes:
ftp://usuario:password@ftp.dominio.com
Pero claro esta URL queda grabada en el navegador del cliente y con esta los datos de acceso al directorio.
En cuanto a la descarga de archivos, quiza debería utilizar archivos comprimidos pero eso obligaría al cliente a tener un programa para descomprimirlos, no se...
Seguire investigando.
orange
He estado investigando por ahí un poco.
Del tema de que no se abran los ficheros no he encontrado nada. Ni siquiera como lo haces tú a través de cabeceras ¿cómo lo haces?, quizá podamos solucionar lo de los caracteres.
Lo de comprimirlos, es la mejor opción de todas (de hecho nosotros lo vamos a imponer). WinZip es shareware, pones un link en tu página para que se lo descarguen (o cualquier utilidad que comprima ZIP que sea gratuita, incluso no necesitas nada si tienen XP) y haces una página de ayuda con un minitutorial de cómo se comprime y descomprime; en la empresa estarán encantados.
En cuanto a los archivos, si te da igual que sepan la dirección, pues no sé porque te comes la cabeza. No te bajes las cosas por FTP, sino por HTTP (que de hecho es a veces más rápido).
Si te sirve con la autenticación que te brinda el servidor (que no es la mejor), pues poner todos los archivos en el directorio, y una página en él con un link a ellos, cuando el usuario haga clic, se lo baja y punto, la autenticación ya la ha hecho para acceder a la página.
Si tienes cosas en ese directorio que no quieres que estén ahí, pues no incluyas los links a ellas (la peña tendría que saberse excatamente el nombre del fichero para descargárselo); o mejor todavía crea otro directorio con otra clave, y enchufas ahí las cosas (además estará más ordenado).
Nosotros creo que vamos a gestionar nuestro propio sistema de autenticación, además de almacenar los nombres de los archivos en una BBDD para generar los links dinámicamente y que no exista referencia física en ningún lado.
Lo único que se me había ocurrido para evitar incluso esto es copiar el archivo en el servidor a un archivo temporal, descargarlo, y borrarlo despues de la descarga; pero me parece mucho pollo.
Juanma
Acerca de los tipos MIME en la cabecera del archivo utilizo este código.
<%@LANGUAGE="VBSCRIPT" CODEPAGE="1252"%>
<%
response.ContentType = "application/zip"
%>
<!--#include file="Archivo en cuestion"-->
La tercera linea identifica al archivo como ZIP lo que hace que el resto del archivo sea enviado directamente al ordenador del cliente, pero casualmente pdf utiliza la cadena "<%" para su construcción lo que hace que el motor intente ejecutar el código (Lo he probado con archivos .doc y funciona perfectamente).
En cuanto a la autenticacion como usuario lo que quiero evitar es que el cliente conozca el usuario y password para acceder al servidor, ya que para acceder al site tiene asignados otros datos.
O sea lo que necesitaría es un código que pase directamente los datos al servidor sin pasar por el cuadro de dialogo.
Josh
En ese caso tu puedes leer el archivo de disco y mandarselo al cliente.
visitante-->tu script---> archivo en zona protegida
Si la autentificación es http y tu asp esta fuera de la zona protegida puede hacer un (soy phpero, ni idea de asp) readfile("ruta/a/la/zona/protegida/archivo.pdf");
Esto crea un stream desde el fichero hasta el navegador del usuario.
En php sería algo así:
<code>
header("Content-type: application/octetstream");
header("Content-Disposition: attachment; filename=nombreficheroque veraelusuario.extension");
readfile("ruta/a/la/zona/protegida/archivo.pdf");
</code>
Juanma
Gracias, voy a ver si encuentro algun equivalente en ASP.
orange
Creo que deberías hacer un sistema de control de usuarios, te sería más fácil y evitarias historias. Es decir, los usuarios tienen un log/pas para acceder a la descarga de los archivos, y sólo se pueden bajar lo que tú quieras en función de su nivel de permisos.
Yo tengo hecho uno en ASP de hace tiempo ¿quieres probar?
PD: ¿Y no habrá un método para enviar el login/pass en la cabecera http cuando el usuario pida el archivo?. Es decir, cuando el usuario hace clic en el enlace al archivo, se le envía a una página que redirecciona al archivo real, con el log/pas en la cabecera. Incluso podrías hacerlo como querías tú con ftp; porque el enlace que marca sería el redirect, no el archivo.