从数据库在ASP.NET(3.5)网页上显示图像

从数据库在ASP.NET(3.5)网页上显示图像,asp.net,Asp.net,我是ASP.NET新手。我正在用ASP.NET 3.5(VS 2008)开发一个网站,我想做的就是: 将图像上载到服务器(我通过FileUpload控件执行此操作) 将数据库中的字节(字节[])保存到某个表中 当用户调用一个页面时,比如Index.aspx?id=10,然后我转到一个表,拉取id=10的相关行,其中一个单元格的图像为byte[]格式 我现在想在网页上显示这张图片,还有其他东西 我似乎不知道怎么做-图像控件只需要一个URL,我不想将图像保存在磁盘上 有什么想法吗 -Rick看一看:

我是ASP.NET新手。我正在用ASP.NET 3.5(VS 2008)开发一个网站,我想做的就是:

  • 将图像上载到服务器(我通过FileUpload控件执行此操作)
  • 将数据库中的字节(字节[])保存到某个表中
  • 当用户调用一个页面时,比如Index.aspx?id=10,然后我转到一个表,拉取id=10的相关行,其中一个单元格的图像为byte[]格式

  • 我现在想在网页上显示这张图片,还有其他东西

  • 我似乎不知道怎么做-图像控件只需要一个URL,我不想将图像保存在磁盘上

    有什么想法吗


    -Rick看一看:

    您需要创建一个实现IHttpHandler接口的类。这样的东西应该足够了:

    public class ImageHttpHandler : IHttpHandler
    {
      //code omitted
    
      public bool IsReusable
      {
        get
        {
          return (false);
        }
      } 
    
      public void ProcessRequest(HttpContext context)
      {
          //GetImageUrl is implemented elsewhere
          var imageURL = GetImageUrl(context.Request.Params["URL"]);
    
          //GetImageContentFromDatabase returns a structure with MIMEType and Content properties
          var imageData = GetImageContentFromDatabase(imageURL);
    
          if(imageData != null)
          {
            context.Response.ContentType = imageData.MIMEType;
            context.Response.BinaryWrite(imageData.Content);
          }
          else
          {
            context.Response.StatusCode = 404;
          }
      }
    }
    
    您可以将此类放置在App_代码目录中,或者,如果您想概括此行为,可以将其放置在单独的程序集中

    然后,您可以在web.config文件中引用此处理程序,如下所示:

    <system.web>
      <httpHandlers>
        <add verb="GET" path="*.imgx" type="ImageHttpHandler"/>
      </httpHandlers>
    </system.web>
    
    
    
    这意味着对扩展名为imgx的文件的所有get请求都应定向到类ImageHttpHandler

    这将与Cassini(VisualStudioDevelopmentWeb服务器)配合使用,但您需要对IIS网站/虚拟目录进行额外更改

    转到IIS MMC管理单元并访问此目录的属性。您需要找到位于“虚拟目录”或“主目录”选项卡中的配置按钮。到达后,添加imgx作为应用程序扩展,将可执行文件设置为aspnet_isapi.dll。它位于我的计算机上,位于C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727。为简单起见,选择“所有动词”,并取消选中“验证文件是否存在”


    您在网页中定义的超链接应使用imgx扩展。根据您的需要,您可以将链接定义为“myimage.imgx”或“GetImage.imgx?id=XXX”。这取决于您的需要以及您打算如何从数据库检索图像内容。

    回答得很好,谢谢David和Canavar。仔细考虑后--我想知道我是否应该省去麻烦,改用文件系统。@rick s:文件系统会更简单,但数据库方法有两种选择:(1)你不必担心网络环境中的权限问题,(2)你可以对发送回来的内容耍花招(例如,调整图像大小、应用效果等),(3)只要能够以编程方式影响响应缓存设置,从而从用户的浏览器缓存而不是服务器的缓存中提供重复请求,就可以提高性能。