无法使用Generic Handler c#从SQL Server检索图像

时间:2014-03-10 08:28:52

标签: c# asp.net sql httphandler ashx

每当我使用Generic Handler检索图像时,我都会检索空图像或图像损坏。

这是我的代码。

aspx文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

//imports
using DHELTASSys.Modules;
using System.Data;
using DHELTASSys.AuditTrail;

namespace DHELTASSys
{
    public partial class EvaluateOffense : System.Web.UI.Page
    {
        DisciplineModuleBL discipline = new DisciplineModuleBL();
        DHELTASSysAuditTrail audit = new DHELTASSysAuditTrail();

        protected void Page_Load(object sender, EventArgs e)
        {
            string position = Session["Position"].ToString();
            if (Session["EmployeeID"] == null)
            {
                Response.Redirect("LogIn.aspx");
            } else if(position != "HR Manager")
            {
                Response.Redirect("AccessDenied.aspx");
            }

            discipline.Offense_emp_id = int.Parse(Session["OffenseID"].ToString());

            DataTable dt = discipline.GetProof();

            if (dt.Rows == null)
            {

                Label9.Visible = false;
                Image1.Visible = false;
            }
        }



        protected void btnEvaluate_Click(object sender, EventArgs e)
        {
            discipline.Offense_emp_id = int.Parse(Session["OffenseID"].ToString());
            discipline.Decision = drpDecision.Text;

            discipline.AddOffenseDecision();

            audit.Emp_id = int.Parse(Session["EmployeeID"].ToString());
            audit.AddAuditTrail(drpDecision.Text + "ed Employee's offense.");

        }
    }
}

这是处理程序:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

//imports
using System.Data;
using DHELTASSys.Modules;
using DHELTASSys.DataAccess;

namespace DHELTASSys
{

    public class ShowImage : IHttpHandler, System.Web.SessionState.IRequiresSessionState
    {
        DisciplineModuleBL discipline = new DisciplineModuleBL();
        public void ProcessRequest(HttpContext context)
        {
            if (context.Session["OffenseID"].ToString() == null) return;
            int offense_emp_id = int.Parse(context.Session["OffenseID"].ToString());
            discipline.Offense_emp_id = offense_emp_id;

            DataTable dt = discipline.GetProof();

            if (dt.Rows == null) return;

            int id = 1;

            string image = dt.Rows[0][1].ToString() + id;

            string FileName = dt.Rows[0][0].ToString();
            string FileContentType = dt.Rows[0][2].ToString();

            Byte[] bytes = (Byte[])dt.Rows[0][1];

            string imageBase64 = Convert.ToBase64String(bytes);

            context.Response.ContentType = "image/" + FileContentType;

            if (context.Request.QueryString["id"] == "1")
            {
                MemoryStream ms = new MemoryStream();

                ms.Write(bytes, 0, bytes.Length);
                context.Response.Buffer = true;
                System.Drawing.Image imagen = System.Drawing.Image.FromStream(ms);
                context.Response.BinaryWrite(bytes);
                ms.Dispose();

            }
            else
            {
                return;
            }






        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

除此之外,这是我的图像对象。

<asp:Image ID="Image1" runat="server" ImageUrl="~/ShowImage.ashx" />

我已经在很多方面调整了我的代码。

图像文件使用数据类型“Image”

存储在SQL Server中

如您所见,我正在使用会话从数据库中检索指定的图像。 我在访问会话时没有任何问题。

提前致谢。

3 个答案:

答案 0 :(得分:0)

您的代码似乎比必要的复杂一点;您可以将二进制数据写入输出流而无需将其加载到内存流中,并且您对System.Drawing.Image对象不执行任何操作。试试这个:

context.Response.OutputStream.Write(bytes, 0, bytes.Length);

答案 1 :(得分:0)

首先,我没有看到您将图像写入响应流的方式有任何问题。有一些无用的代码行,但据我所知,你在绝望中调整代码。基本上,这应该足够好了......

        Byte[] bytes = (Byte[])dt.Rows[0][1];
        context.Response.ContentType = "image/" + FileContentType;

        if (context.Request.QueryString["id"] == "1")
        {
            context.Response.BinaryWrite(bytes);
            context.ApplicationInstance.CompleteRequest(); //just to make sure the ASP.NET pipeline completes the request
        }
        else
        {
            return;
        }

现在,鉴于已将bytes正确地转换为字节数组,“应该”工作。确保添加一些适当的异常处理和日志记录,因为我有点怀疑它在其他地方的问题。因此,请按照以下步骤操作:

  • 清理代码以提高清晰度
  • 调试应用
  • 实施一些异常处理
  • 实施某种错误记录

你应该能够解决这个问题的根源,因为使用BinaryWrite方法发送字节数组没有任何问题

答案 2 :(得分:0)

这是从我的项目

中提取的真实示例

进入page.cs动态设置图片网址:

// for diffrent url using guid in url
imgProfilePic.ImageUrl = "GenericHandler_ShowImage.ashx?Ref=" + Guid.NewGuid().ToString() + "&n=" + lngEmployeeID;

进入处理程序,按表适配器获取图像

// in handler
public void ProcessRequest(HttpContext context)
{
    long EmployeeID = -1;
    if (context.Request.QueryString["n"] != null)
        EmployeeID = long.Parse(context.Request.QueryString["n"].ToString());
    //else
    //    throw new ArgumentException("No parameter specified");

    if (context.Request.QueryString["actid"] == "2")
    {
        ShowThumbPic(context, EmployeeID);
        return;
    }
        //else ...
}

private void ShowThumbPic(HttpContext context, long EmployeeID)
{
    context.Response.ContentType = "image/jpeg";
    Stream myStream = GetEmpImage(EmployeeID);
    byte[] myImgByteArray;

    using (BinaryReader br = new BinaryReader(myStream))
    {
        myImgByteArray = br.ReadBytes((int)myStream.Length);
    }

    MemoryStream ms = new MemoryStream(byteArrayIn);
    System.Drawing.Image img = System.Drawing.Image.FromStream(ms);

    if (img.Height > 50 || img.Width > 50)
    {
        System.Drawing.Size siz = GetScaledSize(img.Size, new System.Drawing.Size(50, 50));
        img = (System.Drawing.Image)ResizeImage(img, siz);
    }


    MemoryStream ms = new MemoryStream();
    img.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
    byte[] myBuffer = ms.ToArray();
    int byteSeq = myBuffer.Length; //myStream.Read(myBuffer, 0, 4096);
    if (byteSeq > 0)
        context.Response.OutputStream.Write(myBuffer, 0, byteSeq);
}

private System.Drawing.Image GetEmployeeImage(long EmployeeID)
{
    System.Drawing.Image img = null;
    try
    {
        using (DAL.dstEmployeeTableAdapters.tbl_Employee_InfoTableAdapter ta = new DAL.dstEmployeeTableAdapters.tbl_Employee_InfoTableAdapter())
        {
            object obj = ta.spr_Employee_Info_GetPicture(EmployeeID);
            if (obj != null)
            {
                MemoryStream ms = new MemoryStream((byte[])obj);
                img = System.Drawing.Image.FromStream(ms);
            }
        }
    }
    catch (Exception x)
    {
        throw new Exception(Msg.Error_InDownloadPicture + x.Message);
    }
    return img;
}

public static Size GetScaledSize(Size ImageSize, Size FrameSize)
{
    int newWidth = ImageSize.Width;
    int newHeight = ImageSize.Height;
    double ratioX = (double)FrameSize.Width / ImageSize.Width;
    double ratioY = (double)FrameSize.Height / ImageSize.Height;
    double ratio = Math.Min(ratioX, ratioY);
    if (ratio < 1.0f) // if Frame is greater than image, resize it.
    {
        newWidth = (int)(ImageSize.Width * ratio);
        newHeight = (int)(ImageSize.Height * ratio);
    }
    return new Size(newWidth, newHeight);
}

public static System.Drawing.Bitmap ResizeImage(System.Drawing.Image image, Size siz)
{
    //a holder for the result
    Bitmap result = new Bitmap(siz.Width, siz.Height);
    // set the resolutions the same to avoid cropping due to resolution differences
    result.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    //use a graphics object to draw the resized image into the bitmap
    using (Graphics graphics = Graphics.FromImage(result))
    {
        //set the resize quality modes to high quality
        graphics.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        //draw the image into the target bitmap
        graphics.DrawImage(image, 0, 0, result.Width, result.Height);
    }

    //return the resulting bitmap
    return result;
}