【问题标题】:How to Fetch and Display an Image from the Database in ASP.Net and C#如何在 ASP.Net 和 C# 中从数据库中获取和显示图像
【发布时间】:2012-12-25 23:45:35
【问题描述】:

有很多关于使用 FileUpload 控制器在数据库表中插入图像的好教程。

但我找不到关于如何获取这些图像并显示它们的好教程。

当我以前将图像名称或路径存储在数据库中(作为 Varchar)时,这样做会非常简单......

HTML/ASP:

<img src="" runat="server" id="myImage" />

C#:

myImage.Src = myReader.getValue(0).toString();

结果:

<img src="/Images/pic.png" runat="server" id="myImage" />

瞧,图片将显示出来。

但现在我想获取上传的图片,而不是路径,意味着表格列的类型是 IMAGE。

有些教程最终会导致全屏显示图片。

我不希望这样,我只是想以与上一个示例中相同的方式获取和显示图像,在我的网页中具有给定的大小和位置。

为什么要上传图片到数据库?因为这些图片是“个人资料图片”,而不是公共图片,所以我不希望客人简单地浏览 /Images/ 来查找我网站的所有图片,无论是公共的还是私人的。

【问题讨论】:

标签: c# asp.net image


【解决方案1】:

首先,要做你想做的事,我只需将文件复制到一个临时位置并将该位置用于“src”属性。稍后,您可以删除该文件。更复杂的方法是创建一个 aspx 页面,将图像作为二进制流写入网页。此页面将从数据库中获取图像,并将流写入响应中。然后,您将在图像的 src 属性中使用此 aspx 页面。但是,将图像路径存储在数据库中并将实际文件存储在文件系统上并不意味着该文件夹必须是可浏览的或公开的。例如,您可以关闭目录浏览。

【讨论】:

    【解决方案2】:

    创建一个自定义的IHttpHandler 实现,它可以为您的数据库中的图像提供服务。例如,您可以将字节放入流中并将该流复制到 Web 响应的输出。

    这是一个简单的例子:

    public class MyImageHandler : IHttpHandler
    {
        public bool IsReusable { get { return true; } }
    
        public void ProcessRequest(HttpContext ctx)
        {
            Stream yourStream = ...; // This is where you get your data from your database
            ctx.Response.ContentType = "image/jpeg";
            yourStream.CopyTo(ctx.Response.OutputStream);
        }
    }
    

    然后您需要对其进行配置以响应您希望的 URL。

    • 您可以使用 Web.config 文件来执行此操作
    • 或者创建一个.ashx 文件并让它指向您自己的HTTP 处理程序

    如果您对此有任何疑问,请写评论。

    【讨论】:

      【解决方案3】:

      您将需要一个 aspx 页面从数据库中读取图像并返回原始字节。

      这里是如何做到这一点的快速草图:

      byte[] data = (byte[])myReader.getValue(0);
      
      Response.ContentType = "image/jpeg"; //or whatever your used image type is
      Response.OutputStream.Write(data, 0, data.Length);
      Response.End();
      

      另一种方法是为此实现自定义 HttpHandler。

      另一部分是从您的 img 标签中“调用”此页面,并带有指定图像 ID 的参数:

      myImage.Src = "/image.aspx?id=" + myReader.getValue(0).toString();
      

      【讨论】:

      • 正确的方法是使用处理程序而不是整页来显示图像。
      • -1 永远不会为此创建一个 .aspx。正如@Aristos 所说,创建一个自定义的IHttpHandler 实现并使用它。
      • 是的,那将是“正确”的解决方案,但提问者似乎在 ASP.NET/web 编程方面没有太多经验。因此,使用专用页面是一个易于理解的概念(与自定义处理程序相比,它“以某种方式”挂钩到处理管道中)并且也可以工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      • 1970-01-01
      • 2019-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多