0

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 读取/编码图像二进制文件的方式,但我不确定。有人可以强调错误的可能原因吗?关于使这项工作或调试的任何建议?

4

1 回答 1

0

我对 DB2 不熟悉,但是由于您能够显示comments,因此您image应该可以正确阅读。假设您的image数据也被正确存储,您的代码不会在浏览器中显示它们,因为它们需要一点不同的照顾comments。每个图像都需要是对服务器的附加 HTTP 请求,因此您必须创建这些<img src=myImg.png>标签来代替图像持有者。

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

首先,您需要<img>在 GivdView1 的图像列中添加一个标签。

然后,在数据绑定过程中,一定要更新为<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将流回每个图像以供浏览器显示。

于 2012-05-21T15:57:38.833 回答