如何将图像从存储在数据库中的二进制数据转换回来?

时间:2012-08-16 09:25:10

标签: c# .net database blob handler

我这里有点问题。

在我的页面上,我使用asp:repeater从我的数据库中读出所有“Projects”。 现在每个项目还包含两个图像(二进制数据),我想将它们转换回处理程序中的图像,并使用处理程序文件作为图像引用。

我在网上发现了这个代码,我也知道它是如何吵闹但我不知道如何使用处理程序:

public Byte[] Ret_image(Int32 id)
{
    SqlCommand cmd = new SqlCommand();
    cmd.CommandText = "SELECT * FROM Project where Id=@id";
    cmd.Connection = con;
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
    SqlDataReader dr = cmd.ExecuteReader();
    dr.Read();
    Byte[] ar = (Byte[])(dr[1]);
    dr.Close();
    cmd.Dispose();
    return ar;
}

我认为这可能会有用,我需要做的就是给每个项目的ID,但我不知道如何实现这个,我甚至不知道上面的代码是否正确

任何人都可以帮助我吗?

提前感谢!

[编辑]

如何为处理程序提供所需的ID?

<asp:Image ID="img" ImageUrl="Image.ashx" runat="server" Height="80" Width="75%" />

或者如何从处理程序中获取正确的ID?

[编辑2]

我做错了什么?图像没有出现,但它并没有说它找不到它们:

<asp:img class="icon-img icon-img_shadow" src="Image.ashx?ID=<%# DataBinder.Eval(Container, "DataItem.id") %>" alt="Icon" width="152" height="140" />

处理程序中的代码:

public void ProcessRequest (HttpContext context) {
    int id = Convert.ToInt32(context.Request.QueryString["ID"]);

    context.Response.ContentType = "image/png";
    MemoryStream strm = new MemoryStream(Ret_image(id));
    byte[] buffer = new byte[4096];
    int byteSeq = strm.Read(buffer, 0, 4096);
    while (byteSeq > 0)
    {
        context.Response.OutputStream.Write(buffer, 0, byteSeq);
        byteSeq = strm.Read(buffer, 0, 4096);
    }
}

public Byte[] Ret_image(Int32 id)
{
    SqlConnection sqlCn = new SqlConnection("Data Source=server;Initial Catalog=db;User ID=user;Password=pw");

    string qry = "SELECT * FROM Project WHERE imageid=@id";
    SqlCommand cmd = new SqlCommand(qry, sqlCn);
    cmd.Parameters.Add("@id", SqlDbType.Int).Value = id;
    SqlDataReader dr = cmd.ExecuteReader();
    sqlCn.Open();
    dr.Read();
    Byte[] ar = (Byte[])(dr[1]);
    dr.Close();
    cmd.Dispose();
    sqlCn.Close();
    return ar;
}

2 个答案:

答案 0 :(得分:3)

您需要创建一个您将作为图片网址定位的ashx页面

然后你需要在该处理程序内的ProcessRequest方法中将字节数组写为响应流......类似于:

context.Response.ContentType = "image/jpeg";
strm = new MemoryStream(ar);   // ar here is your variable from Byte[] ar = (Byte[])(dr[1])
byte[] buffer = new byte[4096];
int byteSeq = strm.Read(buffer, 0, 4096);
while (byteSeq > 0)
{
    context.Response.OutputStream.Write(buffer, 0, byteSeq);
    byteSeq = strm.Read(buffer, 0, 4096);
}

答案 1 :(得分:0)

只需使用MemoryStream类并将字节数组作为构造函数参数传递:

 MemoryStream ms = new MemoryStream(byteArrayIn);
 Image returnImage = Image.FromStream(ms);
 return returnImage;