图像处理程序图像未在Chrome和FF中显示

时间:2016-11-30 05:51:52

标签: c# asp.net

我正在使用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';";
                                                         %>

2 个答案:

答案 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)
    {

    }
}