Hola Gente, Muchas gracias a todos por sus respuestas. Creo que la solución que mas me sirve es la de la protección con el web.config y luego usar el FileStream para leerlos.
MUCHAS GRACIAS A TODOS. Un saludo, Mariano Minoli ----- Original Message ---- From: José A. Fernández <[EMAIL PROTECTED]> To: [email protected] Sent: Monday, July 16, 2007 9:27:45 PM Subject: [puntonet] Descarga de archivos segun usuarios en ASP.NET 2.0 Hola Mariano LA solucion mas rapida y simple...que la utilizo Proteccion de archivos: --------------------------- Colocar tus archivos en una ubicacion protegida (fuera del directorio del website podria ser si tiene acceso al disco completo), pero si no puedes en fuera del website, podrias en una carpeta protegida con autorizacion de asp.net Es por un lado para proteger. <location path="~/recursos/archivos/"> <system.web> <authorization> <allow users="[lista de usuarios separados por comas]" roles="[lista de funciones separadas por comas]"/> <deny users="[lista de usuarios separados por comas]" roles="[ lista de funciones separadas por comas]"/> </authorization> </system.web> </location> Esto en el web.config general por eso de location o tambien puedes en archivo webconfig que contenga solamente este sectgor en la carpeta <configuration> <system.web> <authorization> <deny users=... HAsta ahi tienes protegido, te puede servir si por ejemplo tienes un grupo de descarga para los archivos o simplementa uusarios autenticados solamente puedan descargar Pero si necesitas tener un control mas estricto de la descarga, tendras que implementar lo que te comenta Diego Ahora veamos el tema de la descarga ---------------------------------------- Por lo que comentas son archivos fisicos (es decir no estan en la db, ni tampoco lo estas creando on fly), o sea puedes leerlo mediante codigo, entonces aqui tienes dos opciones A) Leerlos en un objeto FileStream (colo el enlace mas abajo) y luego B) Escribir directamente en la respuesta HTTP (dependiendo de cual grande sea los archivos) De las dos opciones mas abajo coloco los codigo de ejemplo de unos proyectos, creo que te pueden servir La idea es mostrar como quieras los archivos (desde la DB, leyendo el directorio y mostrando las propiedades como ser nombre, tamaño) pero que el visitante no sepa donde estas ubicados. Cuando quiera descargar tendras que realizar uno de los dos opciones y tambien (si miras el codigo) cambiar el ContentType de la cabecera HTTP que como sabras para que el browser sepa que hacer. Enlaces que te pueden servir: -------------------------------- FileStream (Clase) Expone un objeto Stream alrededor de un archivo; se admiten operaciones de lectura y escritura sincrónica y asincrónica. http://msdn2.microsoft.com/es-es/library/system.io.filestream(VS.80).aspx HttpResponse.WriteFile (Método) Escribe el archivo especificado directamente en la secuencia de salida de una respuesta HTTP. http://msdn2.microsoft.com/es-es/library/system.web.httpresponse.writefile(VS.80).aspx Handling Custom File Downloads in ASP.NET With Server Controls http://www.eggheadcafe.com/articles/20011006.asp Downloading Files - Forcing the File Download Dialog http://aspalliance.com/259 Force download http://www.dotnetspider.com/kb/Article1802.aspx OPCION A: Codigo de descarga --------------------------------- Public Sub Descargar(ByVal archivoPath As String, ByVal archivoNombre As String) Try Dim fullPath = Path.GetFullPath(archivoPath) Dim name = archivoNombre Dim ext = Path.GetExtension(fullPath) Dim type As String = "" If Not IsDBNull(ext) Then ext = ext.ToString.ToLower End If Response.Clear() Response.ClearContent() Response.ClearHeaders() Select Case ext Case ".pdf" type = "Application/pdf" Case ".htm", ".html" type = "text/HTML" Case ".txt" type = "text/plain" Case ".doc", ".rtf" type = "Application/msword" Case ".csv", ".xls" type = "Application/x-msexcel" Case ".mp3", ".mpeg", ".mp2", ".wav", ".avi", ".dat", ".jpg", ".swf", ".jpeg", ".bmp" type = "application/octet-stream" Case ".exe" type = "application/octet-stream" Case Else type = "text/plain" End Select Dim streamArchivo As IO.FileStream streamArchivo = IO.File.Open(fullPath, IO.FileMode.Open) Dim getContent(streamArchivo.Length) As Byte streamArchivo.Read(getContent, 0, streamArchivo.Length) streamArchivo.Close() Response.AddHeader("content-disposition", "attachment; filename=" + name) If type <> "" Then Response.ContentType = type End If Response.BinaryWrite(getContent) Response.End() Catch ex As Exception '...obtengo el error End Try End Sub OPCION B: ---------------- string path = archivoFullPath; context.Response.AppendHeader("content-disposition", "attachment; filename=" + archivoNombre); context.Response.ContentType = type; context.Response.WriteFile(path); Espero que te sirva de ayuda o guia ______________________ Jose A. Fernandez On 7/16/07, Leonardo Micheloni <[EMAIL PROTECTED]> wrote: Se me ocurre que no necesariamente los archivos tienen que estar en una dirección, es decir, podés crearlos on the fly. O sea, el usuario se conecta y le listás lo que puede bajar, cuando hace click lees el archivo (desde el origen, un disco, o BD) y lo escribís con el correspondiente content etc en una nueva página para que lo pueda descargar. La otra opción es la que dice Diego, puede ver la url pero el HttpModule no lo deja acceder. Saludos, Leonardo. On 7/16/07, Mariano Minoli < [EMAIL PROTECTED]> wrote: > > > > Buenas lista, > > > > Necesito implementar una página que liste archivos (disponibles en un ftp) > de acuerdo al usuario que esté logueado, permita descargarlos. La cuestión > es que no quiero dejar los archivos disponibles en un directorio virtual del > estilo: > > > > http://misitio.com/archivos/usuario123.pdf > > http://misitio.com/archivos/usuario124.pdf > > http://misitio.com/archivos/usuario125.pdf > > http://misitio.com/archivos/usuario126.pdf > > > > Porque otros podrían ver la url e inferir la url de los archivos de otro > usuario, descargando información que no les corresponde. > > > > Se les ocurre alguna solución que permita descargar archivos y que no > permita que otro usuario, escribiendo la url, acceda a los archivos que no > le corresponde ?? > > > > Desde ya muchas gracias. > > > > > > Mariano Minoli > > ________________________________ > Be a better Globetrotter. Get better travel answers from someone who knows. > Yahoo! Answers - Check it out. -- ____________________________________________________________________________________ Sick sense of humor? Visit Yahoo! TV's Comedy with an Edge to see what's on, when. http://tv.yahoo.com/collections/222
