C# Can';t使用通用处理程序c从SQL Server检索图像#

C# Can';t使用通用处理程序c从SQL Server检索图像#,c#,asp.net,sql,httphandler,ashx,C#,Asp.net,Sql,Httphandler,Ashx,无论何时使用通用处理程序检索图像,我都会检索空图像或断开的图像 这是我的密码 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 DH

无论何时使用通用处理程序检索图像,我都会检索空图像或断开的图像

这是我的密码

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中

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


提前感谢。

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


context.Response.OutputStream.Write(字节,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;
        }
现在,考虑到
字节
已正确转换为字节数组,该“应该”工作。确保添加一些适当的异常处理和日志记录,因为我有点怀疑问题出在其他地方。因此,请遵循以下步骤:

  • 清理您的代码以获得更好的清晰度
  • 调试应用程序
  • 实现一些异常处理
  • 实现某种类型的错误日志记录

您应该能够找到这个问题的症结所在,因为使用
BinaryWrite
方法发送字节数组并没有什么错误

这是从我的项目中提取的真实示例

在page.cs中动态设置图像url:

// 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;
}
//在处理程序中
公共void ProcessRequest(HttpContext上下文)
{
long EmployeeID=-1;
if(context.Request.QueryString[“n”!=null)
EmployeeID=long.Parse(context.Request.QueryString[“n”].ToString());
//否则
//抛出新ArgumentException(“未指定参数”);
if(context.Request.QueryString[“actid”]=“2”)
{
ShowThumbPic(上下文,雇员ID);
返回;
}
//否则。。。
}
私有void showtumbpic(HttpContext上下文,long EmployeeID)
{
context.Response.ContentType=“image/jpeg”;
Stream myStream=GetEmpImage(EmployeeID);
字节[]MyImgByte数组;
使用(BinaryReader br=新的BinaryReader(myStream))
{
myImgByteArray=br.ReadBytes((int)myStream.Length);
}
MemoryStream ms=新的MemoryStream(byteArrayIn);
System.Drawing.Image img=System.Drawing.Image.FromStream(毫秒);
如果(img.高度>50 | | img.宽度>50)
{
System.Drawing.Size siz=GetScaledSize(img.Size,新的System.Drawing.Size(50,50));
img=(System.Drawing.Image)ResizeImage(img,siz);
}
MemoryStream ms=新的MemoryStream();
保存(ms,System.Drawing.Imaging.ImageFormat.Png);
字节[]myBuffer=ms.ToArray();
int byteSeq=myBuffer.Length;//myStream.Read(myBuffer,04096);
如果(字节相等>0)
context.Response.OutputStream.Write(myBuffer,0,byteSeq);
}
private System.Drawing.Image GetEmployeeImage(长EmployeeID)
{
System.Drawing.Image img=null;
尝试
{
使用(DAL.dstEmployeeTableAdapters.tbl_Employee_InfoTableAdapter ta=new DAL.dstEmployeeTableAdapters.tbl_Employee_InfoTableAdapter())
{
object obj=ta.spr\u Employee\u Info\u GetPicture(EmployeeID);
如果(obj!=null)
{
MemoryStream ms=新的MemoryStream((字节[])obj);
img=系统.绘图.图像.源流(ms);
}
}
}
捕获(异常x)
{
抛出新异常(Msg.Error\u InDownloadPicture+x.Message);
}
返回img;
}
公共静态大小GetScaledSize(大小ImageSize,大小FrameSize)
{
int newWidth=ImageSize.Width;
int newHeight=ImageSize.Height;
double ratioX=(double)FrameSize.Width/ImageSize.Width;
双重比率=(双重)FrameSize.Height/ImageSize.Height;
双比值=数学最小值(比值,比值);
if(比率<1.0f)//如果帧大于图像,请调整其大小。
{
newWidth=(int)(ImageSize.Width*比率);
newHeight=(int)(ImageSize.Height*比率);
}
返回新尺寸(新宽度、新高度);
}
公共静态System.Drawing.Bitmap ResizeImage(System.Drawing.Image图像,大小siz)
{
//结果的持有者
位图结果=新位图(siz.Width、siz.Height);
//将分辨率设置为相同,以避免由于分辨率差异而裁剪
结果.设置分辨率(图像.水平分辨率,图像.垂直分辨率);
//使用图形对象将调整大小的图像绘制到位图中
使用(Graphics=Graphics.FromImage(结果))
{
//将“调整大小质量”模式设置为“高质量”
graphics.CompositingQuality=System.Drawing.Drawing2D.CompositingQuality.HighQuality;
graphics.InterpolationMode=System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
graphics.SmoothingMode=System.Drawing.Drawing2D.SmoothingMode.HighQuality;
//将图像绘制到目标位图中
graphics.DrawImage(图像,0,0,结果.宽度,结果.高度);
}
//返回生成的位图
返回结果;
}

您是否尝试过在
字节上设置断点并验证是否从数据库中获取数据?