如何使用处理程序检查图像是否存在于图像控件中以显示图像

时间:2013-01-30 14:41:10

标签: c# asp.net httphandler ashx ascx

处理程序

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();
    }

用户控制

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;
}

在上述程序中,如果我们没有在图像控制中获取图像,我们需要将按钮上的文本显示为“添加图像”,如果我们有图像,我们需要将其显示为“更新图像”

我使用了以下不起作用的方式:

选项1

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

选项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 个答案:

答案 0 :(得分:0)

如果图像不存在,您可以让通用处理程序返回404状态代码:

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;
            }
        }
    }
}

然后在客户端上,您可以使用WebClient来测试图像是否存在:

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";
    }
}