Usuário com melhor resposta
Problemas para salvar Imagem no banco de dados e carrega-la em um campo imagem no Webform.

Pergunta
-
Bom dia amigos!
Estou com um problema para salvar imagens no banco de dados e depois carrega-las em um campo image no C# net! não faço a minima ideia de como faze-lo e sempre que eu encontro alguma coisa é com referencia a windows forms ou VB. Me ajudem por favor!
@Estou usando C# .net e quero salvar a imagem no banco SQL Server 2008.
- Editado Jonathan Peris sábado, 21 de abril de 2012 12:42
- Movido C. Augusto Proiete [MVP]Moderator sábado, 21 de abril de 2012 22:18 Movido para o forum apropriado (De:C#)
Respostas
-
Jonathan,
Segue o exemplo que fiz. Utilizei Linq To Sql para manipular o objeto que criei (apenas uma entidade com o nome Imagem e três propriedades: codigo, nome e arquivo).
1. Construir 1 tabela com 3 campos:
- Codigo: int, auto incremento, chave primária
- Nome: varchar (para guardar o nome do arquivo)
- Arquivo: varbinary [MAX] (para guardar o binario do arquivo)
2. Adicionar um novo item Linq To SQL e insrir a tabela Imagem.3. Criar um UserControl e inserir apenas um controle Imagen:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucImagem.ascx.cs" Inherits="ucImagem" %> <p> <asp:Image ID="Image1" runat="server" Height="144px" Width="183px" /> </p>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class ucImagem : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { Image1.ImageUrl = "msdn_exibir_imagem.aspx"; } }
Este código no Page Load indica que a url da imagem é a página "msdn_exibir_imagem.aspx". Isto porque é está imagem quem vai recuperar o byte da session e exibir.
4. Criar a página "msdn_exibir_imagem.aspx":
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="msdn_exibir_imagem.aspx.cs" Inherits="msdn_exibir_imagem" %> <!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> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html>
Veja que no aspx não tem nada. Agora no .cs tem:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class msdn_exibir_imagem : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Session["Arquivo"] != null) { byte[] byteArquivo = (byte[])Session["Arquivo"]; Response.BinaryWrite(byteArquivo); } } }
5. Criar a página "msdn_upload_imagem.aspx":
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="msdn_upload_imagem.aspx.cs" Inherits="msdn_upload_imagem" %> <%@ Register src="ucImagem.ascx" tagname="ucImagem" tagprefix="uc1" %> <!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> </head> <body> <form id="form1" runat="server"> <div> <fieldset> <legend>Gravar imagem no banco...</legend> <asp:FileUpload ID="FileUpload1" runat="server" Width="218px" /> <br /> <br /> <asp:Button ID="btnGravar" runat="server" Text="Gravar imagem" onclick="btnGravar_Click" /> </fieldset> <br /> <br /> <br /> <fieldset> <legend>Carregar imagem do banco...</legend> <asp:Button ID="btnExibir" runat="server" Text="Exibir imagem" onclick="btnExibir_Click" /> <br /> <uc1:ucImagem ID="ucImagem1" runat="server" /> <br /> </fieldset> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Data.Linq; public partial class msdn_upload_imagem : System.Web.UI.Page { ImagemDataContext db; protected void Page_Load(object sender, EventArgs e) { } protected void btnGravar_Click(object sender, EventArgs e) { db = new ImagemDataContext(); Imagem img = new Imagem(); img.Nome = FileUpload1.FileName; img.Arquivo = ConvertToLinqBinary(FileUpload1.FileContent); db.Imagems.InsertOnSubmit(img); db.SubmitChanges(); } protected void btnExibir_Click(object sender, EventArgs e) { db = new ImagemDataContext(); //recuperando apenas o primeiro arquivo. Binary arquivo = (from i in db.Imagems select i.Arquivo).FirstOrDefault(); byte[] byteArquivo = arquivo.ToArray(); Session["Arquivo"] = byteArquivo; } public static Binary ConvertToLinqBinary(Stream strArquivo) { BinaryReader bReader = new BinaryReader(strArquivo); byte[] byteArquivo = bReader.ReadBytes(Int32.Parse(strArquivo.Length.ToString())); Binary linqByteArray = new Binary(byteArquivo); return linqByteArray; } }
Veja o arquivo salvo no banco e a exibição após clicar em exibir:
Página web:
Paulo César Viana
MCC,MCP,MCTS
--
Marque as respostas e contribua para uma melhora no fórum.- Sugerido como Resposta Levi DomingosModerator sábado, 21 de abril de 2012 17:36
- Marcado como Resposta Harley Araujo segunda-feira, 23 de abril de 2012 11:19
-
Arquivo dbml (do Linq to sql):
Tabela:
Paulo César Viana
MCC,MCP,MCTS
--
Marque as respostas e contribua para uma melhora no fórum.- Sugerido como Resposta Levi DomingosModerator sábado, 21 de abril de 2012 17:36
- Marcado como Resposta Harley Araujo segunda-feira, 23 de abril de 2012 11:19
Todas as Respostas
-
-
-
Jonathan veja este exemplos:
http://www.aspdotnetcodes.com/Insert_Images_Database.aspx
Exemplo do link acima funcionando: http://www.aspdotnetcodes.com/Inserting_Images_Database_Handler_Sample.aspx
E este outro do DevMedia:
http://www.devmedia.com.br/GridView-com-Hint/14725Vitor Mendes | Seu feedback é muito importante para todos!
Visite o meu site: http://www.vitormendes.com.br/ -
Jonathan,
Segue o exemplo que fiz. Utilizei Linq To Sql para manipular o objeto que criei (apenas uma entidade com o nome Imagem e três propriedades: codigo, nome e arquivo).
1. Construir 1 tabela com 3 campos:
- Codigo: int, auto incremento, chave primária
- Nome: varchar (para guardar o nome do arquivo)
- Arquivo: varbinary [MAX] (para guardar o binario do arquivo)
2. Adicionar um novo item Linq To SQL e insrir a tabela Imagem.3. Criar um UserControl e inserir apenas um controle Imagen:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ucImagem.ascx.cs" Inherits="ucImagem" %> <p> <asp:Image ID="Image1" runat="server" Height="144px" Width="183px" /> </p>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class ucImagem : System.Web.UI.UserControl { protected void Page_Load(object sender, EventArgs e) { Image1.ImageUrl = "msdn_exibir_imagem.aspx"; } }
Este código no Page Load indica que a url da imagem é a página "msdn_exibir_imagem.aspx". Isto porque é está imagem quem vai recuperar o byte da session e exibir.
4. Criar a página "msdn_exibir_imagem.aspx":
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="msdn_exibir_imagem.aspx.cs" Inherits="msdn_exibir_imagem" %> <!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> </head> <body> <form id="form1" runat="server"> <div> </div> </form> </body> </html>
Veja que no aspx não tem nada. Agora no .cs tem:
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; public partial class msdn_exibir_imagem : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (Session["Arquivo"] != null) { byte[] byteArquivo = (byte[])Session["Arquivo"]; Response.BinaryWrite(byteArquivo); } } }
5. Criar a página "msdn_upload_imagem.aspx":
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="msdn_upload_imagem.aspx.cs" Inherits="msdn_upload_imagem" %> <%@ Register src="ucImagem.ascx" tagname="ucImagem" tagprefix="uc1" %> <!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> </head> <body> <form id="form1" runat="server"> <div> <fieldset> <legend>Gravar imagem no banco...</legend> <asp:FileUpload ID="FileUpload1" runat="server" Width="218px" /> <br /> <br /> <asp:Button ID="btnGravar" runat="server" Text="Gravar imagem" onclick="btnGravar_Click" /> </fieldset> <br /> <br /> <br /> <fieldset> <legend>Carregar imagem do banco...</legend> <asp:Button ID="btnExibir" runat="server" Text="Exibir imagem" onclick="btnExibir_Click" /> <br /> <uc1:ucImagem ID="ucImagem1" runat="server" /> <br /> </fieldset> </div> </form> </body> </html>
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.IO; using System.Data.Linq; public partial class msdn_upload_imagem : System.Web.UI.Page { ImagemDataContext db; protected void Page_Load(object sender, EventArgs e) { } protected void btnGravar_Click(object sender, EventArgs e) { db = new ImagemDataContext(); Imagem img = new Imagem(); img.Nome = FileUpload1.FileName; img.Arquivo = ConvertToLinqBinary(FileUpload1.FileContent); db.Imagems.InsertOnSubmit(img); db.SubmitChanges(); } protected void btnExibir_Click(object sender, EventArgs e) { db = new ImagemDataContext(); //recuperando apenas o primeiro arquivo. Binary arquivo = (from i in db.Imagems select i.Arquivo).FirstOrDefault(); byte[] byteArquivo = arquivo.ToArray(); Session["Arquivo"] = byteArquivo; } public static Binary ConvertToLinqBinary(Stream strArquivo) { BinaryReader bReader = new BinaryReader(strArquivo); byte[] byteArquivo = bReader.ReadBytes(Int32.Parse(strArquivo.Length.ToString())); Binary linqByteArray = new Binary(byteArquivo); return linqByteArray; } }
Veja o arquivo salvo no banco e a exibição após clicar em exibir:
Página web:
Paulo César Viana
MCC,MCP,MCTS
--
Marque as respostas e contribua para uma melhora no fórum.- Sugerido como Resposta Levi DomingosModerator sábado, 21 de abril de 2012 17:36
- Marcado como Resposta Harley Araujo segunda-feira, 23 de abril de 2012 11:19
-
Arquivo dbml (do Linq to sql):
Tabela:
Paulo César Viana
MCC,MCP,MCTS
--
Marque as respostas e contribua para uma melhora no fórum.- Sugerido como Resposta Levi DomingosModerator sábado, 21 de abril de 2012 17:36
- Marcado como Resposta Harley Araujo segunda-feira, 23 de abril de 2012 11:19
-
Bom dia, eu sei muito pouco disto .
Sera que me poderiam ajudar.
Estou a criar um projeto vo Visual Studio 2013 num projeto web e que inclui duas tabelas que é Noticias e Fotos.A tabela Fotos serve para guardar uma imagem no SQL server 2012 a partir de um FileUpload e depois disso queria que a imagem aparece-se num DetailsView.
Se me podessem ajudar agradecia.
Comprimentos.