none
Problemas para salvar Imagem no banco de dados e carrega-la em um campo imagem no Webform. RRS feed

  • 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.


    sábado, 21 de abril de 2012 12:29

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>
        &nbsp;
        </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.

    sábado, 21 de abril de 2012 14:26
  • 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.

    sábado, 21 de abril de 2012 14:30

Todas as Respostas

  • Você está salvando o binário ou a url da imagem?

    Paulo César Viana
    MCC,MCP,MCTS
    --

    Marque as respostas e contribua para uma melhora no fórum.

    sábado, 21 de abril de 2012 13:16
  • Gostaria de salvar a imagem em binário no banco de dados e depois exibi-la no webform através de um objeto que suporte carregar a imagem :)

    sábado, 21 de abril de 2012 13:27
  • 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/14725

    Vitor Mendes | Seu feedback é muito importante para todos!
    Visite o meu site: http://www.vitormendes.com.br/

    sábado, 21 de abril de 2012 13:48
  • 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>
        &nbsp;
        </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.

    sábado, 21 de abril de 2012 14:26
  • 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.

    sábado, 21 de abril de 2012 14:30
  • 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.

    sexta-feira, 20 de fevereiro de 2015 11:39