Desenvolvimento - ASP. NET

Salvando Imagens em Banco de Dados e Exibindo no Navegador com ASP.NET

Devido a milhares de dúvidas nos fóruns que o autor freqüenta e centenas de e-mails sobre dúvidas neste assunto, o autor decide iniciar seus artigos com este assunto que deixa muitos desenvolvedores ainda de cabelo em pé.

por Fabio Luis Rodrigues



Devido a milhares de dúvidas nos fóruns que freqüento e centenas de e-mails sobre dúvidas nesse assunto, resolvi iniciar meus artigos com esse assunto que deixa muitos desenvolvedores ainda de cabelo em pé.

Não que não exista algo sobre o assunto, pois nosso amigo Carlos de Mattos soluciona esse problema, mas em Visual Basic.NET ainda não foi discutido esse assunto em um artigo.

Usaremos o Banco de Dados Access XP, por ser mais acessível, e permitir a todos os iniciantes acompanhar esse artigo. Os mais experientes poderão utilizar o SQL Server, bastando mudar um pouco mais o código em VB.NET.

Vamos ao Banco de Dados:

Crie um Banco de Dados Access chamado Album.mdb, clicando em "Criar tabela no modo estrutura " e crie uma tabela conforme a figura abaixo, nomearemos de "tblImagens".

Inserindo as Imagens no Banco de dados.

Agora criaremos as funções necessários para Inserção da figura na base de dados. Crie um Webform chamado default.aspx com o seguinte código.

55 <body>
56 <form Runat="server">
57 <font face="arial" size="4">Salvando arquivos no Banco de dados</font><br><br>
57 <table border="0" cellpadding="4" cellspacing="0">
59 <tr>
60 <td align="right">
61 <p>Imagem:</p>
62 </td>
63 <td>
64 <input type="file" Id="tbImagem" Runat="server" />
65 </td>
66 </tr>
67 <tr>
68 <td align="right">
69 <ASP:TextBox Id="tbNome" Runat="server" />
70 </td>
71 </tr>
72 <tr>
73 <td></td>
74 <td align="right">
75 <ASP:Button Id="Button1" Runat="server" Text="Enviar" OnClick= "SalvaImagem" />
76 </td>
78 </tr>
79 </table>
80 <ASP:Label Id="Label1" Runat="server" CssClass="erro" />
81 </form>
82 <table border="0" cellpadding="4" cellspacing="0">
83 <tr>
84 <td><a href="banco.aspx">Banco de Dados</a></td>
85 </tr>
86 </table>
87 </body>

Execute esse Webform, insira uma figura agora, e logo após abra seu Banco de Dados, para conferir se realmente ela está lá.

Exibindo conteúdo do Banco de Dados

Essa tarefa parece até facil nesse momento, mas e exibir as imagens? Você verá que isso era um problema sério, pois o DataGrid não interpreta o array de Bytes como uma imagem, e isso é frustrante.

Agora, exibiremos criando um novo Webform, chamado banco.aspx.

1 <%@ Page Language="VB" Debug="True"%>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4 <SCRIPT Runat="Server">
5
6 Sub Page_Load(Obj As Object, E As System.EventArgs)
7 If Not Page.IsPostBack Then
8 Connect()
9 End If
10 End Sub
11
12 Sub Connect()
13 Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\data\Album.mdb")
14 Dim Cmd As New OleDbCommand("SELECT * FROM tblImagens", Conn)
15 Dim objReader As OleDbDataReader
16
17 Try
18 Cmd.Connection.Open()
19 objReader= Cmd.ExecuteReader()
20 Catch Ex As OleDbException
21 Me.Label1.Text= "Desculpe, erro ao acessar a Base de Dados."
22 Finally
23 Me.DataGrid1.DataSource= objReader
24 Me.DataGrid1.DataBind()
25 Cmd.Connection.Close()
26 End Try
27 End sub
28
29 </SCRIPT>

Nesta página nada fiz além de recuperar o conteúdo da base de dados com a interface IDBDataReader, vocês devem estar se perguntando nesse momento aonde está a imagem?

Veja a interface HTML deste Webform.

43 <body>
44 <form Runat="Server">
45 <ASP:Label Id="Label1" Runat="Server" />
46 <ASP:DataGrid Id="DataGrid1" Runat="server"
47 Width="300"
48 Cellpadding= "6"
49 Cellspacing= "0"
50 Font-Names="verdana"
51 Font-Size="8pt"
52 BorderColor="lightblue"
53 HeaderStyle-BackColor="lightblue"
54 ItemStyle-BackColor="aliceblue"
55 AlternatingItemStyle-BackColor="white"
56 GridLines="Both"
57 AutoGenerateColumns="false" >
58 <Columns>
59 <ASP:BoundColumn HeaderText="<b>Id</b>" DataField="Id" />
60 <ASP:BoundColumn HeaderText="<b>Nome</b>" DataField="Nome" />
61 <ASP:BoundColumn HeaderText="<b>Bytes</b>" DataField="Tamanho" />
62 <ASP:TemplateColumn HeaderText="<b>Ver</b>" >
63 <ItemTemplate>
64 <center><a href="view.aspx?cod=<%# DataBinder.Eval(Container.DataItem, "Id") %>">Ver</a></center>
65 </ItemTemplate>
66 </ASP:TemplateColumn>
67 </Columns>
68 </ASP:DataGrid>
96 </form>
70 </body>

Podemos ver claramente que o segredo parece estar na TemplateColumn das linhas 62-66 no link para outra página.

Vejamos a imagem:

criaremos agora a tão esperada página view.aspx, que nos levará a exibir essa imagem.

1 <%@ Page Language="VB" Debug="true"%>
2 <SCRIPT Runat="server">
3
4 Sub Page_Load(Obj As Object, E As System.EventArgs)
5 If Not Page.IsPostBack Then
6 Me.Image1.ImageUrl= "img.aspx?cod=" & Request.Params("cod")
7 End If
8 End Sub
9
10 </SCRIPT>

HTML de view.aspx

23 <body>
24 <form Runat="server">
25 <ASP:Image Id="Image1" Runat="server" />
26 </form>
27 <table border="0" cellpadding="4" cellspacing="0">
28 <tr>
29 <td><a href="banco.aspx">Retornar</a></td>
30 <td><a href="default.aspx">Inserir nova imagem</a></td>
31 </tr>
32 </table>
33 </body>

Até o momento não exibimos a tão esperada imagem no Navegador, mas finalmente ela irá aparecer em um novo Webform e ultimo desse arquivo.

Então mão a obra, vamos criar img.aspx.

1 <%@ Page Language="VB" Debug="true"%>
2 <%@ Import Namespace="System.Data" %>
3 <%@ Import Namespace="System.Data.OleDb" %>
4 <SCRIPT Runat="server">
5
6 Private Sub Page_Load(sender As Object, e As System.EventArgs)
7 ExibeIMG()
8 End Sub
9
10 Sub ExibeIMG()
11 Dim Conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=c:\data\Album.mdb")
12 Dim strSQL As String= "SELECT * FROM tblImagens WHERE Id=" & Request.Params("cod")
13 Dim Cmd As New OleDbCommand(strSQL, Conn)
14
15 Cmd.Connection.Open()
16 Dim dr As OleDbDataReader= Cmd.ExecuteReader
17
18 If dr.Read() Then
19 Response.ContentType = "image/jpeg"
20 Response.OutputStream.Write(CType(dr("Imagem"), Byte()), 0, CInt(dr("Tamanho")))
21 End If
22
23 Cmd.Connection.Close()
24 Response.End()
25 End Sub
26 </SCRIPT>

Finalmente terminamos a tão esperada Webform para visualização das imagens graças a função Response.OutputStrean.Write().

Conclusão:

Acabamos de criar uma curiosa funcionalidade, é preciso lembrar que uma imagem em Banco de Dados torna seu tamanho considerável, sem contar o desempenho na exibição da imagem, pois a mesma necessita ser retirada por processos programáticos aqui descritos enquanto se ela estivesse no diretório, esse desempenho na exibição seria bem maior.

A partir desse artigo vocês estão aptos a alterar e exibir imagens de formas totalmente diferentes.

Fabio Luis Rodrigues

Fabio Luis Rodrigues - Desenvolvedor de aplicações Web ASP.NET com Visual Basic.NET.