【问题标题】:Can't retrieve image from SQL Server using Generic Handler c#无法使用通用处理程序 c# 从 SQL Server 检索图像
【发布时间】:2014-03-10 08:28:51
【问题描述】:

每当我使用通用处理程序检索图像时,我都会检索空图像或损坏的图像。

这是我的代码。

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" />

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

图像文件使用“图像”数据类型存储在 SQL Server 中

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

提前致谢。

【问题讨论】:

    标签: c# asp.net sql httphandler ashx


    【解决方案1】:

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

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

    【讨论】:

    • 您是否尝试过在bytes 上设置断点并验证您是否从数据库中获取数据?
    【解决方案2】:

    首先,我认为您将图像写入响应流的方式没有任何问题。有几行无用的代码,但我知道正如您所说,您正在绝望地调整代码。基本上,这应该够好了……

            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 方法发送字节数组没有任何问题

    【讨论】:

      【解决方案3】:

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

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

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

      进入handler,通过table adapter获取图片

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

      【讨论】:

        猜你喜欢
        • 2014-08-22
        • 1970-01-01
        • 2013-09-03
        • 1970-01-01
        • 2012-03-03
        • 2019-09-24
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        相关资源
        最近更新 更多