ASP .NET  -  GridView - Enviando, Baixando e deletando arquivos (C#)


  Neste artigo vamos mostrar como enviar arquivos usando o controle FileUpload para uma pasta no servidor e também como exibir os arquivos em um controle GridView. Além disso veremos como baixar e excluir os arquivos enviados através de LinkButtons em um controle ASP .NET GridView.

A classe FileUpload exibe um controle de caixa de texto e um botão Procurar que permitem aos usuários selecionar um arquivo para carregar no servidor.

O usuário especifica o arquivo a ser carregado, inserindo o caminho completo do arquivo (por exemplo, C:\dados\Teste.txt) na caixa de texto do controle. Como alternativa, o usuário pode selecionar o arquivo clicando no botão  Procurar e, em seguida, localizando o arquivo na caixa de diálogo.

Para salvar os arquivos em uma pasta do servidor usamos o método SaveAs do FileUpload e para exibir o tamanho do arquivo usamos a propriedade ContentLength.

O controle GridView permite utilizar os TemplateField para customização e vamos incluir dois controles LinkButtons onde iremos usar a propriedade CommandArgument para definir argumentos que serão passando para o evento Command. Iremos definir os eventos DownloadArquivo e DeletarArquivo que serão implementados no code-behind.

Recursos usados

Criando o projeto ASP .NET

Abra o Visual Studio 2013 Express for Web e clique em New WebSite;

A seguir selecione a linguagem de sua preferência e o template ASP .NET Empty Web Site e informe o nome Aspn_GridView_Upload;

No menu WEB SITE clique em Add New Item;

Selecione o template WebForm e aceite o nome padrão Default.aspx;

A seguir clique com o botão direito sobre o nome do web site e a seguir clique em Add -> New Folder;

Informe o nome Arquivos para a pasta. Nesta pasta iremos salvar os arquivos enviados.

Abra o arquivo Default.aspx no modo Source e inclua os seguintes controles a partir da ToolBox entre as tags <form> </form>:

O leiaute da página deverá estar conforme a figura abaixo:

O código completo da página Default.aspx é visto a seguir:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <h1> 
        <asp:HyperLink ID="HyperLink1" runat="server" NavigateUrl="http://www.macoratti.net">Macoratti .net</asp:HyperLink>
        </h1>
        <hr />
        <asp:FileUpload ID="FileUpload1" runat="server" />
        <asp:Button ID="btnEnviarArquivo" runat="server" Text="Enviar Arquivo" OnClick="EnviarArquivo" />
        <br /> <asp:Label ID="lblmsg" runat="server" Text="Label"></asp:Label><br />
        <hr />
        <asp:GridView ID="gvArquivos" runat="server" AutoGenerateColumns="false" EmptyDataText = "Nenhum arquivo enviado" Width="321px">
            <Columns>
                <asp:BoundField DataField="Text" HeaderText="Nome do Arquivo" />
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID="lnkDownload" Text = "Download" CommandArgument = '<%# Eval("Value") %>' runat="server" OnClick = "DownloadArquivo"></asp:LinkButton>
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField>
                    <ItemTemplate>
                        <asp:LinkButton ID = "lnkDeleta" Text = "Deletar" CommandArgument = '<%# Eval("Value") %>' runat = "server" OnClick = "DeletarArquivo" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>
    </form>
</body>
</html>

Agora vamos definir o código do arquivo code-behind Default.aspx.vb.

No evento Click do botão de comando Enviar Arquivo temos o código que envia o arquivo, salva o arquivo na pasta Arquivos e obtém e exibe o seu tamanho na Label lblmsg:

  protected void EnviarArquivo(object sender, EventArgs e)
  {
        if (FileUpload1.HasFile)
        {
            string nomeArquivo = Path.GetFileName(FileUpload1.PostedFile.FileName);
            long tamanhoArquivo = FileUpload1.PostedFile.ContentLength;
            FileUpload1.PostedFile.SaveAs(Server.MapPath("~/Arquivos/") + nomeArquivo);
            lblmsg.Text = "Arquivo enviado com sucesso.\n" + "Tamanho do Arquivo = " + tamanhoArquivo.ToString() + "bytes";
            Response.Redirect(Request.Url.AbsoluteUri);
        }
        else
        {
            lblmsg.Text = "Por Favor, selecione um arquivo a enviar.";
        }
 }

No evento Load do formulário temos o código que acessa a pasta Arquivos, obtém as informações dos arquivos e as exibe  no controle GridView - gvArquivos:

  protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string[] caminhoArquivos = Directory.GetFiles(Server.MapPath("~/Arquivos/"));
            List<ListItem> arquivos = new List<ListItem>();
            foreach (string filePath in caminhoArquivos)
            {
                arquivos.Add(new ListItem(Path.GetFileName(filePath), filePath));
            }
            gvArquivos.DataSource = arquivos;
            gvArquivos.DataBind();
        }
    }

Agora precisamos definir o código para o tratamento dos eventos DownloadArquivo e DeletarArquivo definidos nos LinkButtons do TemplateField do GridView.

1 - código para DownloadArquivo

  protected void DownloadArquivo(object sender, EventArgs e)
    {
        try 
        {
        string caminhoArquivo = (sender as LinkButton).CommandArgument;
        Response.ContentType = ContentType;
        Response.AppendHeader("Content-Disposition", "attachment; filename=" + Path.GetFileName(caminhoArquivo ));
        Response.WriteFile(caminhoArquivo );
        Response.End();
        }
        catch(Exception ex)
        {
            lblmsg.Text = ex.Message;
        }
    }

2 - Código para DeletarArquivo

protected void DeletarArquivo(object sender, EventArgs e)
    {
        try
        {
          string caminhoArquivo = (sender as LinkButton).CommandArgument;
          File.Delete(caminhoArquivo );
          Response.Redirect(Request.Url.AbsoluteUri);
        }
        catch(Exception ex)
        {
            lblmsg.Text = ex.Message;
        }
    }

Executando o projeto será apresentado a página abaixo, onde clicamos no botão Enviar Arquivo sem informar ou escolher um arquivo a enviar. Note a mensagem solicitando que o usuário escolha um arquivo:

Clicando no botão Escolher e selecionando um arquivo de uma pasta local teremos o caminho e  nome do arquivo exibido na caixa de texto do controle FileUpload:

Clicando no botão Enviar Arquivo veremos a mensagem de envio com sucesso bem como a informação do tamanho do arquivo enviado e os arquivos da pasta Imagens exibidos no GridView:

Clicando no link Download teremos a caixa de diálogo para fazer o download do arquivo selecionado:

Clicando no link Deletar o arquivo será excluído.

Se você desejar incluir uma mensagem para o usuário confirmar a exclusão do arquivo basta incluir a definição para o evento OnClientClick conforme o  código abaixo na definição do TemplateField com ID lnkDeleta:

<ItemTemplate>
    <asp:LinkButton ID = "lnkDeleta" Text = "Deletar" CommandArgument = '<%# Eval("Value") %>' runat = "server" OnClick = "DeletarArquivo"
OnClientClick="return confirm('Deseja realmente deletar este arquivo?');" />
</ItemTemplate>

Após isso ao clicar no link para Deletar teremos o seguinte resultado:

E , é isto ai ... Até o próximo artigo...

Pegue o projeto completo aqui :  Aspn_GridView_Upload.zip

João 6:35 Declarou-lhes Jesus. Eu sou o pão da vida; aquele que vem a mim, de modo algum terá fome, e quem crê em mim jamais terá sede.
João 6:36 Mas como já vos disse, vós me tendes visto, e contudo não credes.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

 

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti