c# - 如何在 ASP.NET 中从数据库加载图像作为 Web 浏览器中的文件?

标签 c# javascript asp.net image c#-4.0

我在 SQL Server 数据库中有一些图像。我想在用户单击按钮时显示它们,但我希望它们作为文件加载到浏览器中,以便当用户调整窗口大小时,图像会自动调整大小。

例如,在 Firefox 中,如果您转到"file"->“打开文件...”并选择计算机上的图像,它会将其加载到新窗口中,并在您拖动滚动条时调整其大小。我的问题是,如何将图像作为文件从 SQL Server 数据库加载到浏览器中?我在表单上有以下代码,用户在 GridView 中单击 View :

<script type="text/javascript">
    function ShowImageInNewPage(url_add) {
        window.open(url_add, 'ViewScreenshot', 'resizable=yes,scrollbars = yes');
    }
</script>

<asp:GridView 
 ID="grdTrades" 
 runat="server" 

 <... removed some properties for brevity ...>
 >
 <Columns>
  <asp:CommandField ShowSelectButton="true" ButtonType="Link" SelectText="Select" /> 

  <.. removed some columns for brevity ...>

  <asp:TemplateField HeaderText="Screenshot" >
   <ItemTemplate>
    <input type="button" size="x-small" value="View" onclick="javascript:ShowImageInNewPage('DisplayImage.aspx?screenshotId=<%# Eval("screenshotId") %>');" />
   </ItemTemplate>
  </asp:TemplateField>
 </Columns>
</asp:GridView>

DisplayImage.aspx 有以下代码:

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {        
        if (Request.QueryString["screenshotId"] != null)
        {            
            int screenshotId= int.Parse(Request.QueryString["screenshotId"]);
            imgScreenshot.ImageUrl = "App_Handlers/ImageHandler.ashx?screenshotId=" + screenshotId;            
        }
    }    
</script>

<html>
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Image ID="imgScreenshot" runat="server" />
    </div>
    </form>
</body>
</html>

App_Handlers/ImageHandler.ashx 有以下代码:

<%@ WebHandler Language="C#" Class="ImageHandler" %>

using System;
using System.Web;
using System.Data;
using DatabaseComponent;

public class ImageHandler : IHttpHandler {

    public void ProcessRequest (HttpContext context) {

        if (context.Request.QueryString["screenshotId"] != null)
        {
            int screenshotId = int.Parse(context.Request.QueryString["screenshotId"]);

            DBUtil DB = new DBUtil();
            DataTable dt = DB.GetScreenshot(screenshotId);

            if (dt != null)
            {
                Byte[] bytes = (Byte[])dt.Rows[0]["screenshot"];
                context.Response.Buffer = true;
                context.Response.Charset = "";
                context.Response.Cache.SetCacheability(HttpCacheability.NoCache);
                context.Response.ContentType = dt.Rows[0]["contentType"].ToString();
                context.Response.AddHeader("content-disposition", "attachment;filename=" + dt.Rows[0]["fileName"].ToString());
                context.Response.BinaryWrite(bytes);               
                context.Response.Flush();
                context.Response.End();
            }
        }        
    }

    public bool IsReusable {
        get {
            return false;
        }
    }
}

以下是 DisplayImage.aspx 的响应 header

Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 10 Nov 2010 13:13:37 GMT
X-AspNet-Version: 4.0.30319
Transfer-Encoding: chunked
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: image/JPG
Connection: Close

我现在已经更改了原来的问题以使用图像处理程序,谢谢@leppie。感谢您的关注!

更新

我现在已将 DisplayImage.aspx 更改为此代码,但现在我得到了一些真正奇怪的行为。当我单击图像链接时,此页面会加载,并且 Firefox 会询问我是否要保存 DisplayImage.aspx。到底是怎么回事?如何让 Firefox 将图像作为文件加载?

显示图像.aspx:

<%@ Page Language="C#" ContentType="image/*"  %>

<script runat="server">        
</script>

<html>
<head runat="server">
    <title></title>
</head>
<body>
    <img  src="App_Handlers/ImageHandler.ashx?screenshotId=<%=Request.QueryString["screenshotId"]%>" /> 
</body>
</html>

如果我从页面声明中删除 ContentType,图像将加载到新窗口中,但图像不会缩放,也不会自行调整大小。拔掉我的头发...

最佳答案

您不应该使用页面来返回图像数据。相反,您应该使用 HttpHandler。 HttpHandler 是一个实现 IHttpHandler 的类界面。 IHttpHandler 接口(interface)比 Page 接口(interface)更底层。 Page 实际上确实实现了 IHttpHandler 本身,但是 Page 的目的是返回 html,这就是为什么你不应该使用它来返回图像数据。

关于c# - 如何在 ASP.NET 中从数据库加载图像作为 Web 浏览器中的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4142805/

相关文章:

c# - 如何为Windows窗体应用程序设置发布者名称

c# - VS2017 不显示建议并且无法导航到插入符号下的符号

javascript - 使用 InnerHTML 显示数组

javascript - 无法从 redom 库导入

c# - 上传带有元数据的文件

asp.net - Azure 站点仅在使用远程数据库在本地运行时才有效

c# - 如何使用已知的 Type 对象来转换对象?

c# - 如何创建一个立即启动的线程(即使有很多线程就绪)?

javascript - 如何使用一些从 Angular 6 中的数组列表中查找重复项?

c# - 文件传输占用大量 CPU