【问题标题】:Image uploading and Retrieval from DB2从 DB2 上传和检索图像
【发布时间】:2012-05-21 05:11:32
【问题描述】:

喂!我正在尝试在 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

图像被插入到数据库中。

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

【问题讨论】:

    标签: asp.net image gridview db2


    【解决方案1】:

    我不熟悉 DB2,但由于您能够显示 comments,因此您的 image 应该可以正确读取。假设您的image 数据也已正确存储,您的代码不会在浏览器中显示它们,因为它们需要与comments 稍有不同的注意事项。每个图像都需要对您的服务器发出额外的 HTTP 请求,因此您必须创建那些 &lt;img src=myImg.png&gt; 标记来代替图像持有者。

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

    首先,您需要在 GivdView1 的图像列中添加一个 &lt;img&gt; 标记。

    那么,在数据绑定的时候,一定要更新为&lt;img src="MyHttpHandler.ashx?id=1"/&gt;,当然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 会将每个图像流回以供浏览器显示。

    【讨论】:

    • 如果正在使用的 SQL 的“WHERE”子句有多个参数,我该如何进行这项工作。我的意思是,对于 HttpHandler,SQL 就像 SELECT IMAGE FROM xxx_TBL WHERE vendor=x, report=y and SEQ=1。图像按供应商、每个报告存储,按序列号 (SEQ) 排序。如果我增加 SEQ 编号。在一个循环中,如何确定 HttpHandler 将返回与我返回的其他数据相对应的图像,例如图片评论。
    • 能否获取到HttpHandler中生成的整个DataTable?
    • 为了给你和想法,以下是数据库表的列:Report Number(unique), Vendor Number, Image Comments, Image, Image SEQ No.每个报告可以有多个图像,因此序列号。给出与其他列标题相关的顺序.它是 INTEGER 类型,从 1-n 开始,其中n 将是数据库中相同报告编号的行数(每张图像一行)
    • 如果它返回多个给您,这意味着您的reportid 不是唯一的列。在您的 IMAGE_TBL 中,您需要有一个可以识别单行的唯一列。如果没有,则需要多个列。在您的查询字符串中,您可以传入多个参数。我看到您有 Image SEQ No 列,如果该列是唯一的,则使用该列。
    • 你可以看看下面的链接。这个想法是您需要在您的OnRowDataBind 事件中找到&lt;img&gt; 控件,然后将其转换为System.Web.UI.HtmlControls.HtmlImage 类,然后使用您的ID 更新其src 属性。 msdn.microsoft.com/en-us/library/…
    猜你喜欢
    • 2021-07-26
    • 2015-06-13
    • 2017-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 2013-09-26
    相关资源
    最近更新 更多