我这里有点问题。
在我的页面上,我使用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;
}
答案 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;