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 Ralha



Em 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:

  1. Crie um novo projeto do tipo ASP.NET em VB.NET e salve-o como ForçandoDownload.
  2. No formulário que é gerado automaticamente pelo template, adicione um controle ListBox e um controle Button.
  3. Renomeie o controle ListBox para lsbArquivos.
  4. 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:

  1. 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.
  2. 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.
  3. 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 Ralha
MCP - 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
Cláudio Ralha

Cláudio Ralha - http://linhadecodigo.com.br/cs2/blogs/ClaudioRalha/default.aspx
Autor dos livros Dominando o Second Life e Segredos do Visual Studio.NET, profissional certificado Microsoft (MCP,MCAD,MCTS e MCPD) e palestrante Microsoft Brasil e Culminis. Já atuou como colunista do Informática etc do Jornal O GLOBO, editor da Revista Infomania e colaborador de várias revistas e sites. No mercado corporativo já desenvolveu para grandes clientes como Petrobras, Shell, Esso, Rede Globo, Furnas, Brascan, ONS, Unibanco e Bolsa de Valores pelas consultorias Accenture, Stefanini, Arcon, ATT/PS, Informaker, Relacional, Value Team e Softtek.