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にバインドしてWebページに表示するコードは次のとおりです。

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に精通していませんが、表示できるのでcommentsimage正しく読む必要があります。データも適切に保存されていると仮定しましょう。imageデータは少し異なる注意が必要なため、コードはブラウザに表示しませんcomments。各画像はサーバーへの追加のHTTPリクエストである必要があるため<img src=myImg.png>、画像ホルダーの代わりにこれらのタグを作成する必要があります。

ではdt、実際の画像データは必要ありません。HttpHandler画像を取得してブラウザにストリーミングする必要があるため、画像のIDが必要です。

まず、<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 に答える