从DB2图像上传和检索(Image uploading and Retrieval from DB2

2019-09-17 08:44发布

H! 我想在DB2数据库中上传图片。 图像尺寸是JPG(6.76 kb的 - 6924个字节)。

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

我的代码中插入图片如下:

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来自数据库的罚款,并显示。 但是,我没有得到任何的图片 - 只是一个小的“缺失的图片(红十字会白)图标”。

上检查数据库,在BLOB场的图像的长度为8192。然而,在将其复制到“TEST”的文件(没有扩展名),大小为13848个字节。 我猜测,可能是因为这样DB2读取/编码图像二值,但我不知道。 可能有人请突出错误的可能原因是什么? 进行此工作或调试任何建议?

Answer 1:

我不熟悉DB2,但因为你可以显示comments ,你的image应该正确读取。 让我们假设你的image数据也存储不当,在浏览器中的代码不会显示出来,因为他们需要一些不同的护理,然后comments 。 每个图像需要是一个额外的HTTP请求到服务器,所以你必须创建这些<img src=myImg.png>到位图像持有人的标签。

在您的dt ,你并不需要实际的图像数据,你只需要ID的形象,因为你需要使用一个HttpHandler检索图像,然后流式传输到浏览器。

首先,你需要一个<img>在GivdView1的image列标签。

然后,在数据绑定,所以将其更新为<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将流的每个图像回浏览器显示。



文章来源: Image uploading and Retrieval from DB2