Search code examples
c#asp.netimageashximagehandler

imagehandler.ashx image doesn't display in chrome


imagehandler.ashx image doesn't display in Chrome browser. How can I fix it..?

My Codes (imagehandler.ashx):

public void ProcessRequest(HttpContext context)
{
    if (context.Request.QueryString["YazarID"] != null)
    {
        string YazarID = context.Request.QueryString["YazarID"];
        DataTable dt = new DataTable();
        string query = "select img from Register where YazarID='" + YazarID + "'";
        dt = Database.GetData(query);

        HttpResponse r = context.Response;
        r.WriteFile("../Pictures/300/" + dt.Rows[0]["img"]);
        HttpContext.Current.ApplicationInstance.CompleteRequest();
        context.Response.Flush();
        context.Response.Close();
        context.Response.End();
    }
}

images looking like this in Chrome browser;

Screenshot an image in Chrome


Solution

  • You are not sending the content-Length. It could mess up the images (and other files) in Chrome. Assuming the file is correctly saved in the database of course.

    public void ProcessRequest(HttpContext context)
    {
        //create a new byte array
        byte[] bin = new byte[0];
    
        //get the item from a datatable
        bin = (byte[])dt.Rows[0]["img"];
    
        //read the image in an `Image` and then get the bytes in a memorystream
        Image img = Image.FromFile(context.Server.MapPath("test.jpg"));
        using (var ms = new MemoryStream())
        {
            img.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
            bin = ms.ToArray();
        }
    
        //or as one-liner
        bin = File.ReadAllBytes(context.Server.MapPath("test.jpg"));
    
        //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 image
        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();
    }