我正在使用Handler显示来自数据库的员工个人资料图片。图像在Internet Explorer中显示正常,但它们不会在Chrome和Firefox中显示。 可能是什么问题?
这是我的代码:
aspx:
<% img_profile.ImageUrl="~/Handler.ashx?empcd="+Session["empcd"].ToString() ;
%>
<asp:Image CssClass="img-rounded img-responsive profile" runat="server" ID="img_profile" Width="150" Height="150" />
图片处理程序代码:
public void ProcessRequest(HttpContext context)
{
try
{
OracleDataReader rdr = null;
OracleConnection dbConn;
dbConn = Conn.getConn();
string empcd = context.Request.QueryString["empcd"].ToString();
OracleCommand cmd = new OracleCommand("select photo img from olphrm.emp_personal where emp_code='"+empcd+"'", dbConn);
dbConn.Open();
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
context.Response.BinaryWrite((byte[])rdr["img"]);
}
if (rdr != null)
rdr.Close();
}
catch (Exception ex)
{
}
}
这是Chrome上的输出:
[![在此处输入图像说明] [1]] [1]
先谢谢你的帮助!!!
更新:
我在我的aspx页面中添加了以下代码,现在显示了image person.png,这意味着有任何错误。如何找到并解决此错误?
<% img_profile.ImageUrl="~/Handler.ashx?empcd="+Session["empcd"].ToString() ;
img_profile.Attributes["onerror"] = "this.src='Images/person.png';";
%>
答案 0 :(得分:0)
您未指定ContentType
。添加content-Length
是一种很好的做法。
public void ProcessRequest(HttpContext context)
{
//create a new byte array
byte[] bin = new byte[0];
//get your data from the db
while (rdr.Read())
{
bin = (byte[])rdr["img"];
}
//clear the buffer stream
context.Response.ClearHeaders();
context.Response.Clear();
context.Response.Buffer = true;
//set the correct ContentType
context.Response.ContentType = "image/jpeg";
//set the filename for the pdf
context.Response.AddHeader("Content-Disposition", "attachment; filename=\"myImage.jpg\"");
//set the correct length of the string being send
context.Response.AddHeader("content-Length", bin.Length.ToString());
//send the byte array to the browser
context.Response.OutputStream.Write(bin, 0, bin.Length);
//cleanup
context.Response.Flush();
context.ApplicationInstance.CompleteRequest();
}
您的代码非常容易受到SQL注入攻击,因为您没有 验证
empcd
并且您没有使用参数化查询。
答案 1 :(得分:-1)
您应该将其转换为base64字符串。
public void ProcessRequest(HttpContext context)
{
try
{
OracleDataReader rdr = null;
OracleConnection dbConn;
dbConn = Conn.getConn();
string empcd = context.Request.QueryString["empcd"].ToString();
OracleCommand cmd = new OracleCommand("select photo img from olphrm.emp_personal where emp_code='"+empcd+"'", dbConn);
dbConn.Open();
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
context.Response.Write( Convert.ToBase64String((byte[])rdr["img"]) );
}
if (rdr != null)
rdr.Close();
}
catch (Exception ex)
{
}
}