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