por Bruno de Andrade

Salvar e Capturar uma imagem no SQL Server em ASP.NET

Para começar precisamos criar a tabela que irá receber nossa imagem:

CREATE TABLE [dbo].[tblImages](
    [imageID] [int] IDENTITY(1,1) NOT NULL,
    [imageData] [image] NULL,
    [imageType] [nvarchar](50) NULL
)

Feito isso vamos para o formulário de upload de imagem:

UploadImage.aspx

<form id="form1" runat="server">
    <asp:FileUpload ID="fupImage" runat="server" />
    <asp:Button ID="btnUpload" runat="server" Text="Upload" onclick="btnUpload_Click" />
    <asp:Image ID="imgImage" runat="server" />
</form>

 UploadImage.aspx.cs

protected void btnUpload_Click(object sender, EventArgs e)
{
    Stream streamImage = fupImage.PostedFile.InputStream;
    int intImageLength = fupImage.PostedFile.ContentLength;
    string strType = fupImage.PostedFile.ContentType.ToString();
    byte[] imgData = new byte[intImageLength];
    streamImage.Read(imgData, 0, intImageLength);
    InsertIntoDB(imgData, strType);
}

private void InsertIntoDB(byte[] imgData, string strType)
{
    using (SqlConnection myConnection = new SqlConnection(strConnectionString))
    {
        string strSQL =  @"INSERT INTO tblImages
                           (imageData, imageType)
                           VALUES (@data, @type)
                           SET @id = SCOPE_IDENTITY()";

        SqlCommand insertCommand = new SqlCommand(strSQL, myConnection);
        insertCommand.Parameters.AddWithValue("@data", imgData);
        insertCommand.Parameters.AddWithValue("@type", strType);
        insertCommand.Parameters.AddWithValue("@id", 0).Direction = ParameterDirection.Output;

        myConnection.Open();
        insertCommand.ExecuteNonQuery();
        int id = Convert.ToInt32(insertCommand.Parameters["@id"].Value);              
        myConnection.Close();

        imgImage.ImageUrl = "GetImage.aspx?id=" + id;
    }
}

Na ação do botão de upload convertemos a imagem em um array de bytes. Após isso, a função InsertIntoDB faz a inserção do array na nossa tabela e recebido o seu id. Para isso foi usado o SCOPE_IDENTITY(). Quem não conhece pode dar uma olhada neste post: http://cbsa.com.br/post/pegar-id-primary-key-do-ultimo-registro-inserido-no-banco-de-dados-de-uma-forma-simples-usando-scopeidentity-e-sqlcommand-em-aspnet-c.aspx.

Em seguida, utilizamos uma segunda página, a GetImage.aspx, que captura o array de bytes do banco de dados, converte ele em uma imagem novamente e responde com essa imagem.

GetImage.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    using (SqlConnection myConnection = new SqlConnection(strConnectionString))
    {
        string strSQL = @"SELECT imageData, imageType
                          FROM tblImages
                          WHERE imageID = @id
                          ORDER BY imageID DESC";

        SqlCommand myCommand = new SqlCommand(strSQL, myConnection);
        myCommand.Parameters.AddWithValue("@id", Request.QueryString["id"]);
        myConnection.Open();
        SqlDataReader dr = myCommand.ExecuteReader();

        while (dr.Read())
        {
            byte[] byteArray = (byte[])dr["imageData"];
            MemoryStream memStream = new MemoryStream();
            memStream.Write(byteArray, 0, byteArray.Length);
            Bitmap bitmap = new Bitmap(memStream);
            Response.ContentType = dr["imageType"].ToString();
            bitmap.Save(Response.OutputStream, ImageFormat.Jpeg);
        }
        dr.Close();
        myConnection.Close();
    }
}

Download do exemplo

Comentários

Carregando comentários

Postar um novo comentário



Processando...