Desenvolvimento - ASP. NET
Forçando o download de arquivos em ASP.NET
Aprenda como forçar o download daqueles arquivos que o seu navegador cisma em carregar automaticamente na própria janela de navegação. E de quebra, descubra porque alguns sites apresentam a informação do pogresso do download e outros não.
por Cláudio RalhaEm alguns tipos de aplicações ASP.NET como as de gerenciamento de documentos, temos a necessidade de forçar o download automático dos arquivos ao invés de disponibilizar um link direto para o download dos mesmos. Isto é particularmente útil para evitar que o arquivo em questão seja aberto dentro do próprio browser, ao invés de oferecer a caixa de diálogo onde é possível optar por abrir o arquivo ou salvá-lo no sistema de arquivos.
Pode parecer a princípio um detalhe bobo, mas a grande verdade é que para o seu cliente forçar esse comportamento pode ser algo vital. A questão ganha ainda mais importância quando lembrarmos que os principais tipos de arquivos (documentos do Word e do Acrobat, planilhas do Excel e apresentações do Power Point) e mesmo um simples arquivo .txt, por padrão são abertos dentro da janela do Internet Explorer, sem sequer solicitar a nossa confirmação.
Se este for o seu problema em pauta, fique tranqüilo pois mostraremos agora como implementar o download obrigatório de documentos.
Contornando o problema
A solução para evitar este tipo de comportamento é simples, embora exija um pouco de código para a sua implementação. Para ilustrar, vamos criar um pequeno exemplo seguindo este roteiro:
- Crie um novo projeto do tipo ASP.NET em VB.NET e salve-o como ForçandoDownload.
- No formulário que é gerado automaticamente pelo template, adicione um controle ListBox e um controle Button.
- Renomeie o controle ListBox para lsbArquivos.
- Renomeie o controle Button para btnBaixar. Altere a seguir a sua propriedade Text para Baixar.
Neste ponto, a sua página deverá se parecer com a da imagem a seguir:
O passo seguinte será adicionar uma pasta para os documentos dentro do nosso projeto de teste com alguns arquivos representativos:
- Clique com o botão direito do mouse sobre o Solution Explorer e selecione no menu de contexto a opção New Folder. Nomeie a nova pasta como Documentos.
- Abra o Windows Explorer e copie alguns documentos (arquivos .pdf, .doc, .xls,.ppt e.txt) que você possua em seu máquina para a pasta Documentos, que acabamos de criar.
- De volta ao Visual Studio, tecle F7 para entrar com o código a seguir no editor de código:
Imports System.IO
Partial Class _Default
Inherits System.Web.UI.Page
Private Const pastaDocumentos As String = "~\Documentos\"
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
listarArquivos()
End If
End Sub
Private Sub listarArquivos()
Dim pasta As New DirectoryInfo(Server.MapPath(pastaDocumentos))
Dim listaArquivos As FileInfo() = pasta.GetFiles()
lsbArquivos.Items.Clear()
lsbArquivos.DataSource = listaArquivos
lsbArquivos.DataBind()
End Sub
Protected Sub btnBaixar_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnBaixar.Click
If lsbArquivos.SelectedIndex <> -1 Then
Dim pasta As New DirectoryInfo(Server.MapPath(pastaDocumentos))
Dim arquivo As New FileInfo(pasta.FullName + "\" + lsbArquivos.SelectedValue)
"Limpa o conteúdo de saída atual do buffer
Response.Clear()
"Adiciona um cabeçalho que especifica o nome default para a caixa de diálogos Salvar Como...
Response.ContentType = "application/octet-stream"
Response.AddHeader("Content-Disposition", "attachment; filename=""" & arquivo.Name & """")
"Adiciona ao cabeçalho o tamanho do arquivo para que o browser possa exibir o progresso do download
Response.AddHeader("Content-Length", arquivo.Length.ToString())
Response.Flush()
Response.WriteFile(arquivo.FullName)
End If
End Sub
End Class
Este é todo o código necessário para fazer nossa mini-aplicação funcionar. Observe no código do evento Click do botão btnBaixar como é simples forçar o donwload. Após examinar o código, tecle Ctrl + F5 para testar e confira o resultado...
Comprove que ao clicarmos em um dos arquivos enumerados na lista e a seguir no botão Baixar, é apresentada a janela de downloads de arquivos:
Viu como foi fácil resolver um problema aparentemente complexo usando ASP.NET? É graças a sua flexibilidade e vastidão de recursos que a plataforma .NET vem ganhando a cada dia mais desenvolvedores. Afinal, se podemos usar uma ferramenta que nos fornece soluções práticas para todos os nossos problemas do dia a dia, pra quê complicar?
Abraços e até a próxima!
Cláudio RalhaMCP - MCAD - MCTS
Palestrante Microsoft .NET Brasil
Líder do grupo Autores MS
Membro do conselho do grupo CommunityXtreme
Membro do grupo Code4All
Membro do grupo CsharpBR