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

Responder a