如何从SQL Server读取映像?

时间:2014-02-04 19:14:43

标签: c# asp.net sql-server

我使用MemoryStream在SQL Server中保存了图像。

现在,我想从SQL Server读取所有图像并在<a href="this is eath of images" >

中显示它们
for (i = 0; i <=  dt.Rows.Count ; i++)
{
   Byte[] img = (Byte[])(reader["image"]);
   MemoryStream ms = new MemoryStream(img);
   BinaryWriter imgforshow = new BinaryWriter(ms);
   ms.Write(img, 0, img.Length);
   div1.InnerHtml = div1.InnerHtml + "<a href='"+ imgforshow +"' runat=server data-   lightbox=roadtrip title=''>";
   div1.InnerHtml = div1.InnerHtml + "<img src='"+ imgforshow +"' width=100 height=140></a> ";
}

如何在这一行中显示图像?

 div1.InnerHtml = div1.InnerHtml + "<a href='"+ imgforshow +"'......
 div1.InnerHtml = div1.InnerHtml + "<img src='"+ imgforshow +"'.......

2 个答案:

答案 0 :(得分:1)

我建议编写一个回写图像的图像处理程序。你可以使用这样的东西:

public void ProcessRequest(HttpContext context)
{
    string id = context.Request.QueryString["id"];
    byte[] img = GetImage(id);
    context.Response.ContentType = "image/jpeg"; // change accordingly
    context.Response.BinaryWrite(img);
    context.Response.Flush();
    context.Response.Close();   
}

请注意,根据您的图片类型,您需要更改回复的内容类型。 GetImage将返回具有指定id的图像的字节数组。您无需将其传递给MemoryStream。

您的SQL查询看起来像这样:

  

SELECT image FROM images WHERE id = @id

try
{
    SqlConnection connection = new SqlConnection(connectionString);
    connection.Open();
    SqlCommand command = new SqlCommand(connection);
    command.CommandText = sqlQuery;
    command.Parameters.Add("id", id);
    command.ExecuteNonQuery();
    connection.Close();
}
catch(Exception e)
{
    // do something with the exception
}

还有另一个选项允许您在页面中一次嵌入所有图像,但它涉及使用数据Uris,这可能会减慢页面的加载速度。首先,您必须将数据库中的图像作为字节数组,然后对字节数组进行base64编码。

byte[] img = GetImage(id);
string imageSource = "<img src=\"data:image/jpeg;base64," +  Convert.ToBase64String(img)  + " />";

不建议用于较大的图像,因为在显示任何图像之前,页面将等待所有图像下载。您的用户可能会在感知的漫长等待时间内感到不安。它可以使用较小的图像。只关注你如何为图像服务。如果它们是几兆字节,我就不会使用这种方法。同样,需要根据图像类型调整mime类型。

答案 1 :(得分:0)

使用服务器图像控制:

<asp:Image runat="server" ID="img1" ImageUrl="getimage.ashx?id=1" />
<asp:Image runat="server" ID="img1" ImageUrl="getimage.ashx?id=2" />
<asp:Image runat="server" ID="img1" ImageUrl="getimage.ashx?id=3" />

AND Inside Handler:

string id = context.Request.QueryString["id"];
DataRow dr = GetImageById(id);
Byte[] myImg = (Byte[])dr["Image"];
context.Response.ContentType = "image/jpeg"; 
context.Response.BinaryWrite(myImg);
context.Response.Flush();
context.Response.Close();