[英]Retrieving image from database with handler
對於學校項目,我必須創建一個網上商店。 我正在嘗試從數據庫中獲取產品圖片,但我似乎無法使其正常工作,因為我在互聯網上的某個地方閱讀過,您應該通過以下處理程序來做到這一點:
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對象。 它仍然被認為是圖像嗎?
另一個編輯:
如果我直接將查詢放到訪問中,它將給我圖片的列,而不是圖片本身...這可能是問題嗎? 如果是這樣,我該如何解決?
您應該像這樣在Response上設置Content-Type Header:
context.Response.ContentType = "image/png";
context.Response.BinaryWrite((byte[])reader["foto"]);
context.Response.Flush();
您是否嘗試返回該HTTP響應消息?
代替void返回byte []的上下文
我明白了,這里的人們發現我缺少很多代碼,並且由於某種原因,通過訪問本身保存圖像不起作用。 我改為制作了一個頁面,將其加載到那里。 對於有相同問題的人,這是我的代碼。
用於將圖像保存在數據庫中的Webform
<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);
}
}
}
}
用於從數據庫中檢索圖像的Web表單(您的網頁)
<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>
網頁背后的代碼
受保護的無效Page_Load(object sender,EventArgs e){int artikelnummer = 1; //連接字符串connectionstring = @“ Provider = Microsoft.ACE.OLEDB.12.0;數據源= C:\\ Users \\ jeroen \\ Documents \\ Visual Studio 2010 \\ Projects \\ producten \\ producten \\ App_Data \\ Bimsports.accdb; Persist Security Info =真正”; OleDbConnection conn =新的OleDbConnection(連接字符串);
//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;
}
}
}
可能可以更輕松,更短地完成它,但是,嘿! 謝謝你的所有投入
關於圖因
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.