【问题标题】:Retrieving image from database with handler使用处理程序从数据库中检索图像
【发布时间】:2014-05-21 13:54:16
【问题描述】:

对于学校项目,我必须创建一个网上商店。我正在尝试从数据库中获取产品图像,但我似乎无法使其工作 我在互联网上的某个地方读到你应该通过处理程序来做到这一点 就是这样:

public class afbeelding : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        //Connect
        string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
        OleDbConnection conn = new OleDbConnection(connectionstring);

        //execute
        int artikelnummer = 1;
        string sql = "SELECT foto FROM Artikel WHERE Artikelnummer =?";
        OleDbCommand cmd = new OleDbCommand(sql, conn);
        cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
        //read
        try
        {
            conn.Open();
            OleDbDataReader reader = cmd.ExecuteReader();
            reader.Read();
            context.Response.BinaryWrite((byte[])reader["foto"]);
        }

        catch 
        {

        }
        finally
        {
            conn.Close();
        }

我应该把它放在 aspx 中:

<asp:Image ID="img_nikeshirt" runat="server" ImageUrl='<%# "afbeelding.ashx?ID=" + Eval("artikelnummer")%>'/>   

我没有错误,但图像不会显示。 谁能帮帮我?

编辑:

顺便说一句,图像在访问数据库中。它说 ole 对象。 它仍然被视为图像吗?

另一个编辑:

如果我将查询直接放入访问中,它会给我图片的列而不是图片本身...这可能是问题吗?如果是这样,我该如何解决?

【问题讨论】:

  • 你应该设置图片需要的响应Content-Type和其他Headers
  • context.Response.ContentType = "image/jpeg"; context.Response.Clear(); context.Response.BinaryWrite((byte[])reader["foto"]);
  • 尝试使用 URL 直接访问处理程序。例如:http://example.com/MySite/afbeelding.ashx。走着瞧吧。这将告诉您问题是否出在您的处理程序上,或者页面如何处理图像。
  • 好的,我尝试这样做是错误的:XML 解析错误:找不到元素位置:localhost:7558/afbeelding.ashx 第 1 行第 1 列:
  • 请考虑您正在使用 articlenumber=1 的文章

标签: c# asp.net database


【解决方案1】:

您是否尝试返回该 HTTP 响应消息?

返回 byte[] 的上下文而不是 void

【讨论】:

    【解决方案2】:

    您应该像这样在响应上设置 Content-Type 标头:

    context.Response.ContentType = "image/png";
    context.Response.BinaryWrite((byte[])reader["foto"]);
    context.Response.Flush();
    

    【讨论】:

    • 我做了,但似乎没有任何改变。
    • 应该用什么代替缓冲区导致缓冲区出错
    • 还是什么都没有 :( 我在想由于某种原因他找不到图像
    【解决方案3】:

    我明白了,伙计们发现我遗漏了很多代码,并且由于某种原因,通过访问本身保存图像不起作用。相反,我制作了一个将其加载到其中的页面。 对于有同样问题的人,这里是我的代码。

    将图像保存在数据库中的网络表单

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
    <form id="form1" runat="server">
    <div>
    
    </div>
    <asp:DropDownList ID="ddlartikel" runat="server" AutoPostBack="true" 
        onselectedindexchanged="ddlartikel_SelectedIndexChanged">
    </asp:DropDownList>
    <br />
    <asp:Image ID="imgfoto" runat="server" />
    <p>Verander Foto's</p>
    <asp:FileUpload ID="FileUpload1" runat="server" />
    <br />
    <asp:Button ID="btnsave" runat="server" Text="Sla op in database" 
        onclick="btnsave_Click" />
    </form>
    </body>
    </html>
    

    用于将图像保存到数据库中的网络表单背后的代码

            protected void Page_Load(object sender, EventArgs e)
            {
                if (!IsPostBack)
                {
    
                    //Connect
                    string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
                    OleDbConnection conn = new OleDbConnection(connectionstring);
    
    
                    //Execute
                    string sql = "SELECT Artikelnummer, Omschrijving FROM Artikel";
                    OleDbCommand cmd = new OleDbCommand(sql, conn);
                    //Read
                    try
                    {
                        conn.Open();
                        OleDbDataReader reader = cmd.ExecuteReader();
                        ddlartikel.DataSource = reader;
                        ddlartikel.DataValueField = "artikelnummer";
                        ddlartikel.DataTextField = "omschrijving";
                        ddlartikel.DataBind();
                    }
                        finally{conn.Close();}
                    FetchPicture();
                }
            }
    
            protected void ddlartikel_SelectedIndexChanged(object sender, EventArgs e)
            {
                FetchPicture();
            }
            private void FetchPicture()
            {
                if (ddlartikel.SelectedIndex > -1)
                {
                    int artikelnummer = Convert.ToInt32(ddlartikel.SelectedValue);
                    string sUrl = string.Format("~/afbeelding.ashx?artikelnummer={0}", artikelnummer);
                    imgfoto.ImageUrl = sUrl;
                }
            }
    
            protected void btnsave_Click(object sender, EventArgs e)
            {
                if (FileUpload1.HasFile)
                {
                    byte[] MyData = FileUpload1.FileBytes;
    
                    int artikelnummer = Convert.ToInt32(ddlartikel.SelectedValue);
                    CBlob.SavePicture(artikelnummer, MyData);
                }
            }
    
    
        }
    }
    

    用于从数据库(您的网页)中检索图像的网络表单

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
    
            Merk:
            <asp:Label ID="lbl_merk" runat="server"></asp:Label>
            <br />
            Maat:
            <asp:Label ID="lbl_maat" runat="server"></asp:Label>
            <br />
            Omschrijving:
            <asp:Label ID="lbl_omschrijving" runat="server"></asp:Label>
            <br />
            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
            Kleur:
            <asp:Label ID="lbl_kleur" runat="server"></asp:Label>
            <br />
            Prijs:
            <asp:Label ID="lbl_prijs" runat="server"></asp:Label>
            <br />
            BTW:
            <asp:Label ID="lbl_btw" runat="server"></asp:Label>
            <br />
            Categorie: 
            <asp:Label ID="lbl_categorie" runat="server"></asp:Label>
    
            <br />
    
            <br />
            <asp:Image ID="img_nikeshirt" runat="server" ImageUrl='<%# "afbeelding.ashx?ID=" + Eval("artikelnummer")%>'/>    
        </div>
    
        </form>
    </body>
    </html>
    

    网页背后的代码

    protected void Page_Load(object sender, EventArgs e) { int artikelnummer = 1; //连接 string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True"; OleDbConnection conn = new OleDbConnection(connectionstring);

        //Execute
        string sql = "SELECT Merk, Maat, Omschrijving, Kleur, Prijs, BTW, Categorie.Categorie FROM Artikel INNER JOIN Categorie ON Artikel.Categorie = Categorie.Categorienummer WHERE Artikelnummer =?";
        OleDbCommand cmd = new OleDbCommand(sql, conn);
        cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
        //Read
        try
        {
            conn.Open();
            OleDbDataReader reader = cmd.ExecuteReader();
    
            while (reader.Read())
            {
                lbl_merk.Text = reader["Merk"].ToString();
                lbl_maat.Text = reader["Maat"].ToString();
                lbl_omschrijving.Text = reader["Omschrijving"].ToString();
                lbl_kleur.Text = reader["Kleur"].ToString();
                lbl_prijs.Text = reader["Prijs"].ToString();
                lbl_btw.Text = reader["BTW"].ToString();
                lbl_categorie.Text = reader["Categorie"].ToString();
            }
            string sUrl = string.Format("~/afbeelding.ashx?artikelnummer={0}", artikelnummer);
            img_nikeshirt.ImageUrl = sUrl;
    
        }
        catch
        {
    
        }
        finally
        {
            conn.Close();
        }
    }
    

    然后我创建了一个类,它查看您请求的数据库中的图像并将其放入 byte[]

           public static byte[] getpicture(int artikelnummer)
            {
                string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
                OleDbConnection conn = new OleDbConnection(connectionstring);
                //Execute
                string sql = "SELECT foto FROM Artikel WHERE Artikelnummer =?";
                OleDbCommand cmd = new OleDbCommand(sql, conn);
                cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
                try
                {
                    byte[] photodata = null;
                    conn.Open();
                    OleDbDataReader reader = cmd.ExecuteReader();
    
                    if (reader.HasRows)
                    {
                        reader.Read();
                        if (!reader.IsDBNull(0))
                        {
                            photodata = new byte[Convert.ToInt32((reader.GetBytes(0, 0, null, 0, Int32.MaxValue)))];
                            long bytesreceived = reader.GetBytes(0, 0, photodata, 0, photodata.Length);
                        }
                    }
                    return photodata;
                }
                catch (Exception ex)
                {
                }
                finally
                {
                    conn.Close();
                }
                return null;
            }
            public static bool SavePicture(int artikelnummer, byte[] photodata)
            {
                int rowupdated = 0;
    
                string connectionstring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\jeroen\Documents\Visual Studio 2010\Projects\producten\producten\App_Data\Bimsports.accdb;Persist Security Info=True";
                OleDbConnection conn = new OleDbConnection(connectionstring);
    
                string sql = "UPDATE Artikel SET foto=? WHERE artikelnummer=?";
                OleDbCommand cmd = new OleDbCommand(sql, conn);
    
    
                conn.Open();
    
                OleDbParameter param = new OleDbParameter("@foto", OleDbType.VarBinary, photodata.Length);
                param.Value = photodata;
                cmd.Parameters.Add(param);
                cmd.Parameters.AddWithValue("Artikelnummer", artikelnummer);
                rowupdated = (int)cmd.ExecuteNonQuery();
    
                return (rowupdated>0);
    
    
    
            }
        }
    }
    

    处理程序正在将其写入页面。

    public class afbeelding : IHttpHandler
    {
    
        public void ProcessRequest(HttpContext context)
        {
            int artikelnummer = 0;
    
            if (context.Request.QueryString["artikelnummer"] != null)
            {
                artikelnummer = int.Parse(context.Request.QueryString["artikelnummer"]);
            }
            if (artikelnummer != 0)
            {
                byte[] bytes = CBlob.getpicture(artikelnummer);
    
                if (bytes != null)
                {
                    context.Response.ContentType = "image/jpeg";
                    context.Response.OutputStream.Write(bytes, 0, bytes.Length);
                }
            }
        }
    
        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
    

    它可能会更容易和更短,但是嘿,它有效! 感谢您的所有意见

    问候 tuinj

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-20
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多