ASP .NET - Criando um Álbum de Fotos (C#)
Neste artigo eu vou criar um álbum de fotos usando os recursos básicos da ASP .NET e a linguagem C#. Este é um artigo para iniciantes.
Nosso objetivo será criar um pequeno projeto que permita incluir e visualizar imagens de um banco de dados SQL Server em um site ASP .NET.
Para isso eu vou precisar de um projeto ASP .NET para criar a interface com o usuário e de um banco de dados para armazenar as imagens.
Logo os recursos usados no projeto serão:
Criando o projeto WEB
Abra o VWD e no menu File clique em New Project;
Selecione a linguagem Visual C# o Item Web e marque o template ASP .NET Web Application informando o nome Album_Fotos e clicando em OK;
Será criado um projeto contendo uma estrutura pronta que usa uma master page e outros recursos como autenticação.
Vamos ajustar a estrutura para o nosso exemplo excluindo a pasta Account, visto que não vamos autenticar o usuário, e alterar o arquivo Site.Master conforme abaixo:
...... </div> <div class="clear hideSkiplink"> <asp:Menu ID="NavigationMenu" runat="server" CssClass="menu" EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal"> <Items> <asp:MenuItem NavigateUrl="~/Default.aspx" Text="Home"/> <asp:MenuItem NavigateUrl="~/About.aspx" Text="About"/> <asp:MenuItem NavigateUrl="~/Incluir.aspx" Text="Incluir Foto"/> <asp:MenuItem NavigateUrl="~/Exibir.aspx" Text="Exibir Fotos"/> </Items> </asp:Menu> </div> ...... |
O código destacado em azul foi incluído de forma a exibir duas novas opções na master page: Incluir Foto e Exibir Fotos.
Vamos ajustar as página Default.aspx e a página About.aspx alterando o texto das páginas.
Ao final desse processo as página Default.aspx e About.aspx deverão ter o leiaute conforme mostra a figura abaixo:
Definindo o Banco de dados
No menu Project clique em Add New Item e selecione o template Data e a seguir SQL Server Database;
Informe o nome Album.mdf e clique no botão Add;
Será apresentada a mensagem abaixo informando que estamos incluindo um arquivo .mdf em um site ASP .NET e sugerindo que o arquivo criado seja colocado na pasta App_Data;
Clique no botão Sim e aceite a sugestão de forma a criar uma pasta App_Code no projeto e o arquivo Album.mdf ser copiado para esta pasta;
Com o banco de dados criado abra a pasta App_Code e clique duas vezes sobre o arquivo Album.mdf para abri-lo na janela DataBase Explorer;
Expanda os itens da conexão Album.mdf e clique com o botão direito sobre o item Tables e clique em Add New Table;
Defina na tabela uma estrutura contendo os campos conforme mostrados a seguir e salve a tabela com o nome Fotos;
Note que o campo id da tabela Fotos é uma chave primária do tipo identity.
Ao final deveremos ter no arquivo web.config a string de conexão definida da seguinte forma:
....... <connectionStrings> <add name="ConexaoSQLFotos" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|\album.mdf;User Instance=true" providerName="System.Data.SqlClient" /> </connectionStrings> ........... |
Criando as páginas do web site
Vamos criar 3 novas páginas em nossa solução que definirão as funcionalidades que desejamos ter na aplicação.
No menu Project clique em Add New Item, selecione o template Web -> Web Form e informe o nome Incluir.aspx e clique no botão Add;
Repita o procedimento e da mesma forma inclua as páginas : Exibir.aspx e Imagem.aspx;
Ao final teremos as páginas :
Incluindo imagens
Vamos agora definir o leiaute da página Incluir.aspx
Selecione e abra a página Incluir.aspx e no menu Table clique em Insert Table;
Vamos definir uma tabela com 6 linhas(rows) e 2 colunas(Columns);
A partir da ToolBox vamos incluir os seguintes controles na tabela:
O código fonte desta página deverá ser o seguinte:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Incluir.aspx.cs" Inherits="Album_Fotos.Incluir" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> <style type="text/css"> .style1 {width: 37%;} .style2 { font-family: "Trebuchet MS";font-size: xx-large; color: #FFFF00; text-align: center; } .style3 { font-family: "Trebuchet MS";} .style4 {width: 555px;} </style> </head> <body> <form id="form1" runat="server"> <div> <table class="style1"> <tr> <td colspan="2" bgcolor="#006699" class="style2"> <strong style="text-align: center">Macoratti.net - Incluir Fotos</strong></td> </tr> <tr> <td class="style3"> Imagem</td> <td class="style4"> <asp:FileUpload ID="fupFoto" runat="server" Width="274px" /> <asp:CustomValidator ID="cusVal" runat="server" onservervalidate="cusVal_ServerValidate" style="font-family: 'Trebuchet MS'"></asp:CustomValidator> </td> </tr> <tr> <td class="style3"> Mensagem</td> <td class="style4"> <asp:TextBox ID="txtMensagem" runat="server" Height="120px" TextMode="MultiLine" Width="443px"></asp:TextBox> </td> </tr> <tr> <td class="style3"> Data</td> <td class="style4"> <asp:TextBox ID="txtData" runat="server" Width="432px" BackColor="#FFFFE6"></asp:TextBox> <asp:Calendar ID="calFoto" runat="server" Height="143px" Width="442px" onselectionchanged="calFoto_SelectionChanged"> </asp:Calendar> </td> </tr> <tr> <td colspan="2" style="text-align: center"> <asp:Label ID="lblmsg" runat="server" style="font-family: 'Trebuchet MS'"></asp:Label> </td> </tr> <tr> <td colspan="2" style="text-align: center"> <asp:Button ID="btnEnviar" runat="server" onclick="btnEnviar_Click" style="text-align: center" Text="Enviar " Width="131px" /> <asp:Button ID="btnRetornar" runat="server" onclick="btnRetornar_Click" Text="Retornar" Width="112px" /> </td> </tr> </table> </div> </form> </body> </html> |
No arquivo code-behind Incluir.aspx.vb vamos incluir o código abaixo:
using System; using System.Web; using System.Web.UI.WebControls; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace Album_Fotos { public partial class Incluir : System.Web.UI.Page { protected void calFoto_SelectionChanged(object sender, EventArgs e) { //exibe a nova data selecionada no textbox txtData.Text = calFoto.SelectedDate.ToShortDateString(); } protected void cusVal_ServerValidate(object source, ServerValidateEventArgs args) { //cria um array de extensões válidas string[] validaExtensao = { "jpg", "jpeg", "png", "gif", "bmp" }; //define args como inválida args.IsValid = false; //pega o nome do arquivo string nomeArquivo = fupFoto.PostedFile.FileName; //verifica se a string não é vazia if (!string.IsNullOrEmpty(nomeArquivo)) { //pega a extensão do arquivo string fileExt = nomeArquivo.Substring(nomeArquivo.LastIndexOf('.') + 1).ToLower(); //verifica se a extensão atual é válida for (int i = 0; i < validaExtensao.Length; i++) { if (fileExt == validaExtensao[i]) //se for valida args.IsValid = true; //valida } } } protected void btnEnviar_Click(object sender, EventArgs e) { //verifica se o arquivo selecionado foi selecionado if (fupFoto.PostedFile != null && !string.IsNullOrEmpty(fupFoto.PostedFile.FileName) && cusVal.IsValid) { //cria um array de bytes para armazenar os dados da imagem byte[] imgFoto = new byte[fupFoto.PostedFile.ContentLength]; //armazena o arquivo selecionado na memória HttpPostedFile img = fupFoto.PostedFile; //define os dados binários img.InputStream.Read(imgFoto, 0, (int)fupFoto.PostedFile.ContentLength); //conecta com o banco de dados SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSQLFotos"].ConnectionString); //salva a imagem no banco de dados SqlCommand cmd = new SqlCommand("INSERT INTO Fotos(imagem, tamanho, tipo, data, mensagem) VALUES (@imagem, @tamanho, @tipo, @data, @mensagem)", conn); cmd.CommandType = CommandType.Text; //inclui os dados binários cmd.Parameters.Add("@imagem", SqlDbType.Image, imgFoto.Length).Value = imgFoto; //inclui o tamanho da imagem cmd.Parameters.AddWithValue("@tamanho", imgFoto.Length); //inclui o tipo da imagem cmd.Parameters.AddWithValue("@tipo", fupFoto.PostedFile.ContentType); //inclui a data dataa cmd.Parameters.AddWithValue("@data", DateTime.Parse(txtData.Text)); //inclui uma mensagem cmd.Parameters.AddWithValue("@mensagem", txtMensagem.Text); using (conn) { //abre a conexão conn.Open(); //envia a consulta SQL para o banco de dados cmd.ExecuteNonQuery(); } lblmsg.Text = " Imagem enviado com sucesso..."; } else { lblmsg.Text = "Informações inválidas..."; } } protected void btnRetornar_Click(object sender, EventArgs e) { Response.Redirect("Default.aspx"); } } } |
Executando o projeto teremos a página Default.aspx exibindo as opções do menu e clicando no menu Incluir Foto teremos a exibição da página Incluir.aspx conforme abaixo à direita:
Exibindo Imagens
Abaixo temos o leiaute da página Exibir.aspx. Nela temos o controle Repeater onde vinculamos os campos Imagem, mensagem e data.
A partir da Toolbox inclua um controle Repeater nesta página ID=Repeater1 e configure o controle com um ItemTemplate conforme mostrado ao lado da figura do leiaute:
<asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"> <HeaderTemplate> <table border="1" cellpadding="5px"> </HeaderTemplate> <ItemTemplate> <!-- Imagem --> <tr> <td colspan="3"> <asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("id", "~/Imagem.aspx?id={0}") %>' Width = '80' Height='80' /> </td> </tr> <!-- Mensagem/Data/ Link para exibir --> <tr> <td> <%# Eval("mensagem") %> </td> <td> <%#Eval("data", "{0:d}")%> </td> <td> <asp:HyperLink ID="HyperLink1" NavigateUrl ='<%# Eval("id", "~/Imagem.aspx?id={0}") %>' runat="server" Text="Exibir Imagem" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> |
No ItemTemplate do controle Repeater definimos uma tabela onde vinculamos o campo mensagem, data e criamos um hiperlink usando o controle Hyperlink que chama a página Imagem.aspx e passa como parâmetro o código da imagem (id).
Incluímos também um controle SqlDataSource(ID=SqlDataSource1) onde configuramos uma conexão com o banco de dados Album.mdf acessando todos os campos da tabela Fotos
A seguir atribuímos a propriedade DataSourceID do controle Repeater com o id do SqlDataSource que é : SqlDataSource1
O código completo do arquivo Exibir.aspx é o seguinte:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Exibir.aspx.cs" Inherits="Album_Fotos.Exibir" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>Exibindo Fotos</title> </head> <body> <form id="form1" runat="server"> <div> <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1" onitemdatabound="Repeater1_ItemDataBound"> <HeaderTemplate> <table border="1" cellpadding="5px"> </HeaderTemplate> <ItemTemplate> <!-- Imagem --> <tr> <td colspan="3"> <asp:Image ID="Image1" runat="server" ImageUrl='<%# Eval("id", "~/Imagem.aspx?id={0}") %>' Width = '80' Height='80' /> </td> </tr> <!-- Mensagem/Data/ Link para exibir --> <tr> <td> <%# Eval("mensagem") %> </td> <td> <%#Eval("data", "{0:d}")%> </td> <td> <asp:HyperLink ID="HyperLink1" NavigateUrl ='<%# Eval("id", "~/Imagem.aspx?id={0}") %>' runat="server" Text="Exibir Imagem" /> </td> </tr> </ItemTemplate> <FooterTemplate> </table> </FooterTemplate> </asp:Repeater> <asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="<%$ ConnectionStrings:ConexaoSQLFotos %>" SelectCommand="SELECT * FROM [Fotos]"></asp:SqlDataSource> <asp:Button ID="btnRetornar" runat="server" onclick="btnRetornar_Click" Text="Retornar" Width="162px" /> </div> </form> </body> </html> |
O arquivo code-behind Exibir.aspx.vb tem o seguinte código:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Album_Fotos { public partial class Exibir : System.Web.UI.Page { protected void btnRetornar_Click(object sender, EventArgs e) { Response.Redirect("Default.aspx"); } } } |
Executando o projeto e clicando no menu Exibir Fotos iremos obter a seguinte página:
Exibindo uma imagem
A página Imagem.aspx terá somente o código no seu arquivo code-behind Imagem.aspx.vb conforme abaixo:
using System; using System.Data; using System.Data.SqlClient; using System.Configuration; namespace Album_Fotos { public partial class Imagem : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //verifica se existe uma querystring valida if (!string.IsNullOrEmpty(Request.QueryString["id"].ToString())) { //conecta com o banco de dados SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConexaoSQLFotos"].ConnectionString); //seleciona uma imagem SqlCommand cmd = new SqlCommand("SELECT * FROM Fotos WHERE id=@ImgId", conn); cmd.CommandType = CommandType.Text; //inclui o id da imagem obtido da query string cmd.Parameters.AddWithValue("@ImgId", Request.QueryString["id"]); using (conn) { //abra a conexão conn.Open(); //evia a consulta para selecionar a imagem SqlDataReader rdr = cmd.ExecuteReader(); //le os dados if (rdr.Read()) { //armazena os dados binarios em um byte array byte[] imgDados = (byte[])rdr["imagem"]; //exibe a imagem Response.ContentType = rdr["tipo"].ToString(); Response.OutputStream.Write(imgDados, 0, imgDados.Length); } } } } } } |
Este código irá receber o id da imagem selecionando-a da tabela Fotos e exibindo na página no seu tamanho natural:
Assim temos um singelo álbum de fotos bem básico. Você pode incrementar o projeto com diversas funcionalidades.
Pegue o projeto completo aqui: Album_Fotos.zip
Heb 1:1
Havendo Deus antigamente falado muitas vezes, e de muitas maneiras, aos pais, pelos profetas,Heb 1:2
nestes últimos dias a nós nos falou pelo Filho, a quem constituiu herdeiro de todas as coisas, e por quem fez também o mundo;Heb 1:3
sendo ele o resplendor da sua glória e a expressa imagem do seu Ser, e sustentando todas as coisas pela palavra do seu poder, havendo ele mesmo feito a purificação dos pecados, assentou-se à direita da Majestade nas alturas,Heb 1:4
feito tanto mais excelente do que os anjos, quanto herdou mais excelente nome do que eles.Referências: