Dev (Back & Front)ARTIGO

ASP .NET – Acesso seguro com download de arquivos na web – Parte 02

O objetivo destes artigos é
mostrar como criar uma aplicação ASP .NET que tenha as
seguintes funcionalidades:

  • Permitir
    o acesso seguro a uma página de um web site realizando a
    autenticação do usuário;
  • Exibir
    os arquivos passíveis de download do site ao usuário
    autorizado;
  • Efetuar
    o download do arquivo selecionado pelo usuário.

Na primeira
parte
, concluímos a
primeira funcionalidade, criando a estrutura e a página de login
para o web site.

Hoje vamos exibir os arquivos para download na página Download.aspx
e permitir que o usuário efetue o download do arquivo.

Para realizar essa tarefa,
vou usar as classes Directory e FileInfo
para obter as informações e apresentar os nomes dos arquivos
que desejamos tornar disponíveis para o usuário.

Vamos exibir os nomes dos
arquivos em um controle ListBox(ID=lstArquivos)
na página Download.aspx e usando um controle
Button(ID=btnDownload) para iniciar o download
do arquivo.

Quando o usuário clicar no
botão, iremos gerar um stream para o navegador
permitindo assim o download do arquivo.

O leiaute da página Download.aspx
é mostrado a seguir:

No arquivo code-behind Default.aspx.vb,
vamos usar criar o código usando a linguagem Visual Basic para
realizar as seguintes tarefas:

  1. Criar uma lista de arquivos
    disponíveis para download usando o método GetFiles
    da classe Directory;
  2. Preencher o controle ListBox
    com os nomes dos arquivos ;
  3. Processar o download do arquivo
    gerando um stream do arquivo selecionado para o navegador
    usando o objeto Response.

Antes de partir para o
código, vamos criar uma nova pasta no web site chamada Imagens.

Clique com o botão direito
do mouse sobre o nome do web site e selecione New Folder
e digite o nome Imagens.

A seguir, vamos incluir
algumas imagens nessa pasta, clicando com o botão direito sobre
ela e selecionando a opção Add Existing Item, e
inclua algumas imagens conforme a figura abaixo:

Agora vamos ao código…

Abra o arquivo Download.aspx.vb
e declare no início do arquivo o seguinte namespace:

Imports System.IO

No evento Load do
formulário vamos definir o código abaixo:

<strong> Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load</strong><br />        Dim arquivos() As String<br />        Dim index As Integer<br /><br />        If (Not Page.IsPostBack) Then<br />            'obtem uma lista dos arquivos das imagens no diretorio de exemplo<br />            arquivos = Directory.GetFiles(Server.MapPath("Imagens"))<br /><br />            'para exibir os arquivos vamos remover o caminho<br />            For index = 0 To arquivos.Length - 1<br />                arquivos(index) = New FileInfo(arquivos(index)).Name<br />            Next index<br /><br />            'vincula a lista de arquivos ao ListBox<br />            lstArquivos.DataSource = arquivos<br />            lstArquivos.DataBind()<br /><br />            'seleciona a primeira entrada da lista<br />            lstArquivos.SelectedIndex = 0<br />        End If<br /><br />    End Sub

Esse código preenche um
array de strings com os nomes dos arquivos obtidos da pasta
Imagens exibindo os nomes das imagens no controle ListBox;

Quando o usuário
selecionar um arquivo e clicar no botão Download,
devemos permitir o dowload do arquivo. Para isso, inclua o código
abaixo no evento Click do botão:

 Protected Sub btnDownload_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDownload.Click<br />        Dim arquivo As FileInfo<br />        Dim nomeArquivo As String<br /><br />        'obtem o nome completo do arquivo seleiconado<br />        nomeArquivo = Server.MapPath("Images") & "\" & lstArquivos.SelectedItem.Text<br /><br />        'obtem os dados do arquivo<br />        arquivo = New FileInfo(nomeArquivo)<br />        'gera o stream no navegador<br />        Response.Clear()<br />        Response.AddHeader("Content-Disposition", "attachment; filename=" & lstArquivos.SelectedItem.Text)<br />        Response.AddHeader("Content-Length", arquivo.Length.ToString())<br />        Response.ContentType = "application/octet-stream"<br />        Response.WriteFile(nomeArquivo)<br />        Response.End()<br /><br />    End Sub

Esse código obtém o nome
do arquivo selecionado, obtém os dados do arquivo e inicia o
download.

Executando o projeto, iremos obter:

Página de download

Selecionando o arquivo,
vemos a janela Abrir com opção para salvar o arquivo ou
exibi-lo.

Dica:
Estamos trabalhando com arquivos que já existem, mas se
você precisar trabalhar com uma imagem gerada na
memória, você pode usar

Response.BinaryWrite() para
gerar um stream de array de bytes ou escrever a saída
diretamente em Response.OutputStream.

Exemplo:

<em>Bitmap bmp = gerando imagem bmp<br />Response.ContentType = "image/jpeg"<br />Response.AppendHeader("Content-Disposition","attachment; filename=LeftCorner.jpg")<br />bmp.Save(Response.OutputStream, ImageFormat.Jpeg)<br /></em>

Nota: Se
você quiser disponibilizar um arquivo para download diretamente
em um hiperlink em uma páginas ASP.NET, pode fazer assim:

01. Defina o hiperlink na
página conforme abaixo:

<a
href=”download.aspx?arquivo=/Imagens/teste.gif”>Download
da imagem</a>

02. Defina o arquivo download.aspx
para receber como parâmetro (via QueryString) o
nome do arquivo:

<%@ Page language="vb" runat="server" explicit="true" strict="true" %><br /><script language="vb" runat="server"><br />Sub Page_Load(Sender As Object, E As EventArgs)<br />	Dim strRequest As String = <strong>Request.QueryString("arquivo")</strong><br />          'obtem o caminho do arquivo    <br />	If strRequest <> "" Then <br />		Dim path As String = Server.MapPath(strRequest)<br />		Dim arquivo As System.IO.FileInfo = New System.IO.FileInfo(path) '<br />                    'verifica se o arquivo existe no servidor<br />		If file.Exists Then<br />			Response.Clear()<br />			Response.AddHeader("Content-Disposition", "attachment; filename=" & arquivo.Name)<br />			Response.AddHeader("Content-Length", file.Length.ToString())<br />			Response.ContentType = "application/octet-stream"<br />			Response.WriteFile(file.FullName)<br />			Response.End 'if file does not exist<br />		Else<br />			Response.Write("Este arquivo não existe.")<br />		End If <br />	Else<br />		Response.Write("Forneça o nome do arquivo para download.")<br />	End If<br />End Sub<br /></script>

Em outro artigo abordarei o
problema de forçar o download de um arquivo. Aguarde…

Pegue o projeto completo
aqui: acessoSeguroComDownload.zip

Eu sei, é apenas ASP .NET,
simples, simples assim…

é referência em Visual Basic no Brasil e autor dos livros "Aprenda Rápido: ASP" e "ASP, ADO e Banco de Dados na Internet". Mantenedor do site macoratti.net.

Ver perfil