Skip Navigation Links
Novas Tecnologias
Ferramentas Adicionais
Ferramentas Adicionais


Dica No :
689
Assunto : ASP.NET
Titulo: Truques com download de arquivos

Gostou do texto ? Vote e dê sua opinião! Pontuação atual :

Translate this page now :






Adicione aos Favoritos!
BlogBlogs Rec6 Linkk Ueba Technorati Delicious DiggIt! StumbleUpon



O download de arquivos pode muitas vezes ser visto como tarefa simples : Basta fazer um link para o arquivo e ele é baixado pelo browser.

Mas essa simplicidade toda tem problemas : Primeiramente, o browser tenta fazer a interpretação do tipo que está sendo baixado e ao invés de salva-lo em disco abre diretamente para o usuário.

Outro problema é que não se tem controle de quantos downloads realmente foram realizados. Além disso o download só funciona se o arquivo estiver diretamente em uma pasta do site web, dificultando o controle do download, através de login, por exemplo.

Para contornar este problema podemos fazer o download via código. O processo é bem simples : Configuramos alguns headers para informar que é um download e desejamos que o browser salve o arquivo em seguida abrimos o arquivo e entregamos os bytes para o client.

É importante observar que o arquivo não precisa estar em um diretório que faça parte do site, consequentemente temos uma proteção maior do arquivo. Além disso a página que for realizar o download pode contabilizar o número de downloads e outros controles que se façam necessários.

Veja abaixo uma sub para realização de download :

Public Sub DownloadFile(ByVal FilePath As String, Optional ByVal ContentType As String = "")

If File.Exists(FilePath) Then
Dim myFileInfo As FileInfo
Dim StartPos As Long = 0, FileSize As Long, EndPos As Long

myFileInfo = New FileInfo(FilePath)
FileSize = myFileInfo.Length
EndPos = FileSize

HttpContext.Current.Response.Clear()
HttpContext.Current.Response.ClearHeaders()
HttpContext.Current.Response.ClearContent()

Dim Range As String =
HttpContext.Current.Request.Headers("Range")
If Not ((Range Is Nothing) Or (Range = "")) Then
Dim StartEnd As Array =
Range.Substring(Range.LastIndexOf("=") + 1).Split("-")
If Not StartEnd(0) = "" Then
StartPos = CType(StartEnd(0), Long)
End If
If StartEnd.GetUpperBound(0) >= 1 And Not StartEnd(1) = ""
Then
EndPos = CType(StartEnd(1), Long)
Else
EndPos = FileSize - StartPos
End If
If EndPos > FileSize Then
EndPos = FileSize - StartPos
End If
HttpContext.Current.Response.StatusCode = 206
HttpContext.Current.Response.StatusDescription = "Partial"

HttpContext.Current.Response.AppendHeader("Content-Range",
"bytes " & StartPos & "-" & EndPos & "/" & FileSize)
End If

If Not (ContentType = "") And (StartPos = 0) Then
HttpContext.Current.Response.ContentType = ContentType
End If

HttpContext.Current.Response.AppendHeader("Content-disposition",
"attachment; filename=" & myFileInfo.Name)
HttpContext.Current.Response.WriteFile(FilePath, StartPos,
EndPos)
HttpContext.Current.Response.End()
End If

End Sub


Para utilizar esta sub basta chama-la em um ponto qualquer da página. Observe que a sub cancela tudo que já foi enviado ao client e envia o arquivo. Veja :

DownloadFile("c:\fotos\foto.gif","image/gif ")


Esta dica foi produzida com o auxilio de Rodrigo Glauser, desenvolvedor .NET e esquiador das montanhas do chile.


Nome :
E-mail:
Comentarios :
 
 
Os Últimos Comentários
data: 7/26/2005 2:41:00 PM
nome: Ronaldo
email: vanessaro@ligbr.com.br
comentário:
Gostaria de saber mais detalhes de como utilizar esta função, tem como enviar algum exemplo...


 1  
Dicas
Dica do Dia
Receba Dicas Por Email
E-mail :  
 


 (help)
Aceito receber informativos do devASPNet, informações de eventos e treinamentos

Veja Quais Informativos Você Receberá

Pesquisar Dicas
Pesquisar Artigos, Dicas e Noticias

Banco de Dados
Algumas Entrevistas
Links Importantes

Búfalo Informática, Treinamento e Consultoria
R. Alvaro Alvim, 37/920 Centro - Cinelândia - Rio de Janeiro Cep: 20031-010
Tel : (21) 2262-1368 (21) 9240-5134 E-mail : Contato@bufaloinfo.com.br