quarta-feira, 6 de junho de 2012

Asp.Net - Criando um formulário para Upload de Arquivos


No artigo deste mês abordarei como criar um formulário para Upload de arquivos em Asp.Net. Este tipo de artigo é muito útil para quem deseja implementar em seus projetos a possibilidade de fazer uma área dinâmica para Upload e posteriormente uma implementação de Downloads destes mesmos arquivos. Utilizarei como ferramenta de desenvolvimento o Microsoft Visual Studio 2010 e o Microsoft SQL Server 2008 sendo este último responsável por armazenar informações importantes referentes a estes arquivos, como: Tipo, Nome, Descrição e Tamanho em Bytes.

Criando a Tabela de Upload

Importante informar que antes de criarmos a tabela é necessário ter uma base de dados criada, que no nosso caso específico deixei como “DB_SITETHECLUB”, mas fique a vontade para criar como quiser.


CREATE TABLE [dbo].[TB_DOWNLOAD]
(
      [COD_ARQ] [int] IDENTITY(1,1) NOT NULL,
      [NOM_ARQ] [varchar](80) NULL,
      [TIP_LIN] [varchar](30) NULL,
      [DES_ARQ] [varchar](max) NULL,
      [TAM_ARQ] [int] NULL,
      CONSTRAINT [PK_TB_DOWNLOAD] PRIMARY KEY CLUSTERED
(
  [COD_ARQ] ASC
)
WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
)ON [PRIMARY]


Nossa tabela irá conter os seguintes campos:

Nome
Tipo
Descrição
COD_ARQ
Integer
Chave Primária, responsável pelo controle interno dos registros.
NOM_ARQ
Varchar(80)
Nome do arquivo a realizar o Upload.
TIP_LIN
Varchar(30)
Nome da pasta onde o arquivo será salvo.
DES_ARQ
Varchar(max)
Uma breve descrição do arquivo.
TAM_ARQ
integer
Tamanho em Bytes do arquivo.

Criando o Modelo de Dados

Para trabalhar com o Linq To Entity é necessário adicionar um “ADO.NET Entity Data Model”, para isto siga as etapas abaixo:

1-) Clique com botão direito sobre o projeto escolhendo “Add New Item” e definindo como “TheClubModel.edmx”.
2-) A tela seguinte escolha “Generate From Database”, pois esta tabela irá vir de um Banco de Dados, clique em “Next”.
3-) Escolha uma conexão com o SQL Server já existente um crie uma se necessário, partindo assim para a próxima etapa.
4-)Escolha a tabela criada anteriormente no SQL Server, no caso deverá clicar em TB_DOWNLOAD para assim finalizarmos este processo.
5-) Foi criado uma camada de Dados chamada “TheClubModel.edmx”, localizado na pasta “App_Code”. Dê um duplo clique no mesmo para adicionarmos a tabela dentro no modelo criado. Poderá fazer isto facilmente clicando com o botão direito e escolhendo a opção “Update model from Database”. Ver Imagem 01.

Figura 01: Entidade TB_DOWNLOAD.

Importante: Esta parte de nosso artigo foi explicada de uma forma rápida e concisa pelo fato de possuirmos outros artigos que abordam estas etapas de uma forma mais detalhada.

Criando o Formulário de Upload

Crie um novo projeto clicando em File/New/WebSite escolhendo a opção “ASP.NET Dynamic Data Enitites Web Site”, ou seja, utilizaremos o “Linq To Entities” para trabalhar com o Bando de Dados.
Devemos criar uma pasta para armazenar nossos arquivos, no meu caso criei uma chamada “Downloads”, para quem não sabe basta clicar com o botão direito sobre o Projeto e escolher “New Folder”, Ver Imagem 02.


Figura 02: Criando uma Pasta para armazenamento de arquivos.

Portanto dentro desta pasta Downloads deverá conter todos os sub-diretórios necessários para uma melhor organização. Foram criadas três Pastas, sendo: Executáveis, Compactados e Documentos. Posteriormente estes sub-diretórios serão carregados dinamicamente em um formulário dentro de uma Combobox.

Por padrão o Asp.Net cria uma Página chamada “Default.aspx”, recomendo realizar a exclusão da mesma para a criação do formulário de Uploads. Os passos para realizar esta tarefa serão parecidos com os de criar uma pasta, clicando em “Add New Item” e escolhendo a opção “WebForm.aspx” definindo o nome como “FrmUploads.aspx". Adicione alguns componentes, como sugere a tabela a seguir:

Componente
Propriedades Utilizadas
Label
Text: The Club - Formulário para Upload de Arquivos
ID: lbTitulo
Label
Text: Categoria
ID: lbCategoria
DropDownList
ID: dpTipo
Label
Text: Descrição
ID: lbDescricao
TextBox
Text: “Vazio”
ID: txtDescricao
TextMode: MultiLine
Label
Text: Diretório
ID:
lbDiretorio
FileUpload
ID: fUploadArquivo
Button
Text: Upload de Arquivo!
ID: btUpload
Label
Text: “vazio”
ID: lbMensagem

O Formulário deverá ficar identico ao da Figura 03.

Figura 03: Layout do Formulário de Upload.

Codificando o Formulário

No Evento “Page_Init” alimentamos o Dropdownlist categoria com o nome das pastas criadas anteriormente, para isto utilizamos a classe “DirectoryInfo” e o comando “Server.MapPath” nos possibilitará localizar a pasta “Downloads” em nosso servidor.

Os namespaces utilizados:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Configuration;
using System.IO;
using DB_SITETHECLUBModel;


O código correspondente:


protected void Page_Init(object sender, EventArgs e)
{
DirectoryInfo dir = new DirectoryInfo(Server.MapPath("~\\Downloads"));

        dpTipo.Items.Add("");

        foreach (var tipos in dir.GetDirectories())
        {
            dpTipo.Items.Add(new ListItem(tipos.Name));
        }
}


O Evento Page_Init ocorre antes do Page_Load, portanto é nele o lugar certo de alimentar nosso componente DropDownList.

Agora vamos para a função responsável por Limpar nossos componentes após a execução, veja a seguir:


void Limparcampos()
{
    txtDescricao.Text = string.Empty;
    dpTipo.SelectedIndex = 0;
}


Segue a listagem da implementação do código btUpload_Click.


protected void btUpload_Click(object sender, EventArgs e)
{
    //Testar se ocorreu alguma exceção
    try
    {
        //Testar se escolheu algum arquivo
        if (fUploadArquivo.PostedFile != null)
        {
//Variáveis para armazenar o Nome, tamanho e    Diretório do Arquivo
string Nom_Arq = fUploadArquivo.PostedFile.FileName.Substring(fUploadArquivo.PostedFile.FileName.LastIndexOf("\\") + 1);

int Tam_Arq = fUploadArquivo.PostedFile.ContentLength;

string Dir_Arq = Server.MapPath("~\\Downloads\\");

//Verifica se o tamanho do arquivo em Bytes é válido
             if (Tam_Arq <= 0)
             {
lbMensagem.Text = " A tentativa de UpLoad do Arquivo falhou! ";
             }
             else
             {
//Comando responsável por salvar o arquivo no Servidor
fUploadArquivo.PostedFile.SaveAs(Dir_Arq + dpTipo.Text + "\\" + Nom_Arq);

//Chama a função para Salvar no Banco de Dados
                    InserirDados(Nom_Arq, Tam_Arq);

                    //Exibe uma Mensagem ao Usuário
lbMensagem.Text = "O seu arquivo foi gravado com sucesso no seguinte diretório: " + Dir_Arq + dpTipo.Text + "\\" + Nom_Arq;
             }
        }

    }
    catch
    {
lbMensagem.Text = "A tentativa de UpLoad do Arquivo falhou!";
    }

    Limparcampos();
       
}


private void InserirDados(string Nom_Arq, int Tam_Arq)
{
     //Instanciar a classe do Modelo de Dados
DB_SITETHECLUBEntities db = new DB_SITETHECLUBEntities();

     //Inserir dados
     TB_DOWNLOAD down = new TB_DOWNLOAD
     {
            NOM_ARQ = Nom_Arq,
            TIP_LIN = dpTipo.Text,
            DES_ARQ = txtDescricao.Text,
            TAM_ARQ = Tam_Arq
     };

     //Aplicar alterações no Banco de Dados
     db.AddToTB_DOWNLOAD(down);
     db.SaveChanges();
}


Primeiramente implementamos um Try..Catch para evitar Exceções inesperadas e logo em seguida verifico se o FileUpload está vazio. Crio as variáveis necessárias como: Nome, Tamanho e Diretório do arquivo para ser posteriormente salvo tanto no servidor da aplicação quanto no Banco de Dados utilizando a Função InserirDados(). Ver Imagem 04.

Figura 04: Exemplo em Run-Time.


Conclusão

Procurei neste artigo, demonstrar uma forma bastante simples de realizar Upload de arquivos utilizando o Asp.Net. Neste caso foi desenvolvida uma tela simples de Upload que no futuro poderemos programar sem muito esforço uma de Download.  Caso tenha sugestões a respeito de temas que gostaria  ver publicado em nossa revista sinta-se a vontade em nos enviar que iremos fazer o possível para atendê-lo!
Um Forte abraço a todos e até o mês que vem! 

Nenhum comentário:

Postar um comentário