【问题标题】:Displaying an image on a ASP.NET (3.5) webpage, from a database在 ASP.NET (3.5) 网页上显示来自数据库的图像
【发布时间】:2009-09-10 21:25:15
【问题描述】:

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

  1. 上传图片到服务器(我是通过 FileUpload 控件来做的)
  2. 将数据库中的字节(byte[])保存在某个表中
  3. 当用户调用一个页面时,比如 Index.aspx?id=10,然后我去一个表,拉出 id=10 的相关行,其中一个单元格的图像在字节[ ] 格式

  4. 我现在想在网页上显示这张图片,其中还有其他内容。

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

有什么想法吗?

-瑞克

【问题讨论】:

    标签: asp.net


    【解决方案1】:

    您需要创建一个实现 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_Code 目录中,或者,如果您想概括此行为,则可以放在单独的程序集中。

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

    <system.web>
      <httpHandlers>
        <add verb="GET" path="*.imgx" type="ImageHttpHandler"/>
      </httpHandlers>
    </system.web>
    

    这意味着对扩展名为 imgx 的文件的所有获取请求都应定向到类 ImageHttpHandler。

    这适用于 Cassini(Visual Studio 开发 Web 服务器),但您需要对 IIS 网站/虚拟目录进行额外更改。

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

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

    【讨论】:

      【解决方案2】:

      【讨论】:

      • 很好的答案,感谢 David 和 Canavar。在考虑了这一点之后——我想知道我是否应该省去麻烦而只使用文件系统。
      • @rick s:文件系统会更容易,但是您可以使用数据库方法有几个选择:(1)您不必担心网络环境中的权限,(2 ) 您可以对发回的内容进行一些技巧(例如,调整图像大小、应用效果等),(3) 只需能够以编程方式影响响应缓存设置,以便从用户的浏览器缓存而不是来自您的服务器。
      猜你喜欢
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2016-04-28
      • 2013-10-18
      • 1970-01-01
      相关资源
      最近更新 更多