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.
--