图像上传和从DB2中检索

时间:2012-05-21 05:11:32

标签: asp.net image gridview db2

ħ!我试图在DB2数据库中上传图像。 图像大小为JPG(6.76 kb - 6924字节)。

数据库表的BLOB字段长度为1048576。

我插入图片的代码如下:

If fileup.PostedFile IsNot Nothing AndAlso fileup.PostedFile.FileName <> "" Then
   Dim imagesize As Byte() = New Byte(fileup.PostedFile.ContentLength - 1) {}
   Dim uploadedimage1 As HttpPostedFile = fileup.PostedFile

   uploadedimage1.InputStream.Read(imagesize, 0, CInt(fileup.PostedFile.ContentLength))

   Dim uploadedimage2 As New OleDbParameter("@Image", OleDbType.VarBinary, imagesize.Length)
   uploadedimage2.Value = imagesize

   Dim cmd As New OleDbCommand()
   cmd.CommandText = "INSERT INTO xxx_TBL(x, IMAGE)  VALUES (?, ?)"
   cmd.Parameters.Add(x)
   cmd.Parameters.Add(uploadedimage2)

   cmd.Connection = clsDatabase.Open_DB()
   Dim result As Integer = cmd.ExecuteNonQuery()
   If result > 0 Then
      Return True

图像被插入数据库。

将数据从数据库中获取到DataTable中的代码,然后绑定到GridView以显示在网页上,如下所示:

Dim cmd As New OleDbCommand()

cmd.CommandText = "SELECT x, IMAGE FROM xxx_TBL WHERE y = 1" 

cmd.Connection = clsDatabase.Open_DB()
Dim dReader As OleDbDataReader
dReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)

Dim dt As New DataTable
dt.Columns.Add(New DataColumn("Comments", GetType(String)))
dt.Columns.Add(New DataColumn("Picture", GetType(Bitmap)))

Do While (dReader.Read())
   Dim dr As DataRow = dt.NewRow()

   dr("Comments") = dReader(0).ToString
   Dim imageobj = dReader(1)
       Using ms As New System.IO.MemoryStream
            Dim bm As Bitmap
            Dim bytearray = DirectCast(imageobj, Byte())
            ms.Write(bytearray, 0, bytearray.length)
            bm = New Bitmap(ms)
            dr("Picture") = bm
       End Using

    dt.Rows.Add(dr)
Loop

GridView1.DataSource = dt
GridView1.DataBind()

x来自数据库正常,并显示。但是,我没有拍照 - 只是一张小的&#34;缺失的照片(白色的红十字)图标&#34;。

在检查数据库时,BLOB字段中图像的长度为8192.但是,在将其复制到“测试”上时。文件(无扩展名),大小为13848字节。我猜这可能是因为DB2读取/编码图像二进制文件的方式,但我不确定。 有人可以请突出显示可能的错误原因吗?有关进行此项工作或调试的任何建议吗?

1 个答案:

答案 0 :(得分:0)

我不熟悉DB2,但由于您能够显示comments,因此应正确阅读image。假设您的image数据也已正确存储,您的代码将不会在浏览器中显示,因为它们需要稍微不同的关注comments。每张图片都需要为您的服务器提供额外的HTTP请求,因此您必须创建这些<img src=myImg.png>代码来代替图片持有者。

dt中,您不需要实际的图像数据,只需要图像的ID,因为您需要使用HttpHandler来检索图像,然后流式传输到浏览器。

首先,您需要在GivdView1的图片列中添加<img>标记。

然后,在数据绑定期间,请确保将其更新为<img src="MyHttpHandler.ashx?id=1"/>,当然,ID值必须是动态的。

现在,将新文件Generic Handler添加到Visual Studio项目并将其命名为MyHttpHandler.ashx并编写如下代码:

public class MyHttpHandler : IHttpHandler
{    
    public void ProcessRequest(HttpContext context)
    {
        string sid = context.Request.QueryString["id"];
        int id = -1;
        if(int.TryParse(sid, out id) && id > 0){
            cmd.CommandText = "SELECT IMAGE FROM xxx_TBL WHERE ID=" + id.ToString() + ";";
            byte[] img = dr["IMAGE"];
            context.Response.ContentType = "image/png";
            context.Response.BinaryWrite(img);
        }
    }

    public bool IsReusable
    {
        get
        {
            return false;
        }
    }
}

现在,在gridview呈现html之后,浏览器将对所有这些图像发出HTTP请求,并且MyHttpHandler.ashx将流回每个图像以供浏览器显示。

相关问题