How to check if an image exists in an image control with a handler to display the image

こ雲淡風輕ζ 提交于 2019-12-11 00:06:46

问题


Handler

public class Handler2 : IHttpHandler
{
    public void ProcessRequest(HttpContext context)
    {
        string id = context.Request.QueryString["Id"];
        string constr = System.Configuration.ConfigurationManager
            .ConnectionStrings["EmployeeDatabase"].ConnectionString;
        SqlConnection con = new SqlConnection(constr);

        con.Open();
        SqlCommand cmd = new SqlCommand("GetImage", con);
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@EmpID", id);
        //cmd.Parameters.AddWithValue("@Gender", ge);
        SqlDataReader dr = cmd.ExecuteReader();
        dr.Read();

        if (dr.HasRows)
        {
            byte[] imageBytes = (byte[])dr.GetValue(0);
            context.Response.BinaryWrite(imageBytes);
        }

        dr.Close();
        con.Close();
    }

User Control

public void BindGridviewData()
{
    String empid1 = Name;
    // String empid1 = Request.QueryString["MyText"];
    int empid = int.Parse(empid1);
    //int empid = 1500422;
    string constr = System.Configuration.ConfigurationManager
        .ConnectionStrings["EmployeeDatabase"].ConnectionString;
    SqlConnection con = new SqlConnection(constr);

    con.Open();
    SqlCommand cmd = new SqlCommand("GetEmployeeDetails", con);
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.Parameters.Add("@EmpID", SqlDbType.Int, 0).Value = empid;
    SqlDataReader dr = cmd.ExecuteReader();
    dr.Read();

    Label9.Text = dr[0].ToString();
    Label2.Text = dr[1].ToString();
    Label3.Text = dr[2].ToString();
    Label4.Text = dr[3].ToString();
    Label5.Text = dr[4].ToString();
    Label6.Text = dr[5].ToString();
    Label7.Text = dr[6].ToString();
    Label8.Text = dr[7].ToString();

    Image2.ImageUrl = "~/Handler2.ashx?Id=" + empid;
}

In the above program if we are not getting image in image control we need to display the text on button as "Add your Image" and if we have image we need to display it as "Update your Image"

I have used following ways which are not working:

Option 1

 if (Image2.ImageUrl != null)
 {
     PageLinkButton.Text = "Upadte your Image";
 }
 else
 {
     PageLinkButton.Text = "Add your Image";
 } 

Option 2

WebClient client = new WebClient();
byte[] Value = client.DownloadData(Image2.ImageUrl);

if (Value != null)
{
    PageLinkButton.Text = "Update your Image";
}
else
{
    PageLinkButton.Text = "Add your Image";
}  

回答1:


You could have your generic handler return 404 status code if the image doesn't exist:

public void ProcessRequest(HttpContext context)
{
    string id = context.Request.QueryString["Id"];
    string constr = System.Configuration.ConfigurationManager.ConnectionStrings["EmployeeDatabase"].ConnectionString;
    using (var con = new SqlConnection(constr))
    using (var cmd = con.CreateCommand())
    {
        con.Open();
        cmd.CommandText = "GetImage";
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.Parameters.AddWithValue("@EmpID", id);
        using (var dr = cmd.ExecuteReader())
        {
            if (dr.Read())
            {
                // the image was found
                byte[] imageBytes = (byte[])dr.GetValue(0);
                // Don't forget to set the proper content type
                context.Response.ContentType = "image/png";
                context.Response.BinaryWrite(imageBytes);
            }
            else
            {
                // no record found in the database => return 404
                context.Response.StatusCode = 404;
            }
        }
    }
}

and then on the client you could use a WebClient to test if the image exists:

var imageUrl = "~/Handler2.ashx?Id=" + empid;
var baseUri = new Uri(Request.Url.GetLeftPart(UriPartial.Authority));
var url = new Uri(baseUri, VirtualPathUtility.ToAbsolute(imageUrl));
using (var client = new HttpClient())
{
    var request = new HttpRequestMessage(HttpMethod.Head, url);
    var response = client.SendAsync(request).Result;
    if (response.IsSuccessStatusCode)
    {
        // the image exists:
        PageLinkButton.Text = "Update your Image";
        Image2.ImageUrl = imageUrl;
    }
    else
    {
        // the image does not exist:
        PageLinkButton.Text = "Add your Image";
    }
}


来源:https://stackoverflow.com/questions/14606612/how-to-check-if-an-image-exists-in-an-image-control-with-a-handler-to-display-th

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!