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:
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;
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)
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:
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