【问题标题】:Retrieving image file from database and displaying in web page in Asp.Net从数据库中检索图像文件并在 Asp.Net 的网页中显示
【发布时间】:2016-08-23 15:57:36
【问题描述】:

我正在尝试在 ASP.NET 网页中显示数据库中的图像。我正在使用通用处理程序 .aspx 和 .ashx。我尝试显示它,但每次运行它时,它都会显示损坏的图像图标。

下面是我的 .ashx 代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.IO;
using System.Configuration;
using MySql.Data.MySqlClient;

namespace test
{
    /// <summary>
    /// Summary description for HandlerImage
    /// </summary>
    public class HandlerImage : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            string connection = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
            using (var conn = new MySqlConnection(connection))
            {
                using (var comm = new MySqlCommand("SELECT FileId, [FileName], ContentType, Data FROM files WHERE FileId=16", conn))
                {
                    using (var da = new MySqlDataAdapter(comm))
                    {
                        var dt = new DataTable();
                        conn.Open();
                        da.Fill(dt);
                        conn.Close();
                        byte[] Data = (byte[])dt.Rows[0][3];

                       context.Response.ContentType = "image/jpeg";
                       context.Response.ContentType = "image/jpg";
                       context.Response.ContentType = "image/png";
                       context.Response.ContentType = "application/pdf";

                        context.Response.BinaryWrite(Data);
                        context.Response.Flush();
                    }

                }
            }

        }

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

下面是我的 .aspx 代码:

<div>
<asp:Image ID="Image1" runat="server" ImageUrl="HandlerImage.ashx?FileId=2" Width="200" Height="200"/>
</div>

任何帮助将不胜感激。

【问题讨论】:

  • 您是否在 web.config 中注册了您的 .ashx?您可能必须在两个地方执行此操作(一个用于集成管道,一个用于经典管道)。

标签: c# asp.net database imagehandler


【解决方案1】:

为图像目的创建一个页面,例如GetMeImage.aspx,功能如下

protected void Page_Load(object sender, EventArgs e)
{
    if (Request.QueryString["ImageID"] != null)
    {
SqlConnection conn = new SqlConnection("DataSource=localhost; Database=varbinary; User ID=****; Password=****");
         SqlCommand comm = new SqlCommand();
         comm.Connection = conn;

         comm.CommandText = "select * from files where FileId=@id";
         comm.Parameters.AddWithValie("@id", Convert.ToInt32(Request.QueryString["ImageID"]);

         SqlDataAdapter da = new SqlDataAdapter(comm);
         DataTable dt = new DataTable();

         da.Fill(dt);



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

下面的代码在你想显示图片的页面上:

<asp:image ID="Image1" runat="server" ImageUrl ="GetMeImage.aspx?ImageID=1"/>

【讨论】:

  • 您从哪里获得 ImageID?在我的数据库中,只有 FileId、FileName、ContentType 和 Data(图像文件)。
  • ImageID是从传来的QueryString参数
【解决方案2】:

您的 SQL 表中有 4 列名为 files

  1. 文件ID
  2. 文件名
  3. 内容类型
  4. 数据

但在您的 C# 代码中,您选择 第二列 来获取图像:

byte[] Data = (byte[])dt.Rows[0][1];

其实应该是这样的:

byte[] Data = (byte[])dt.Rows[0][3];

除此之外,您应该更改用于检索图像的 ADO.NET 代码以将连接字符串存储在 web.config 文件中,并通过实现 using{} 来使用适当的资源处理

1.将连接字符串保存在web.config中:

<configuration>
  <connectionStrings>
    <add name="connection" connectionString="Put your SQL connection here"/>
  </connectionStrings>
    <system.web>
      <compilation debug="true" targetFramework="4.5" />
      <httpRuntime targetFramework="4.5" />
    </system.web>
</configuration>

2. 像这样更改 HandlerImage.ashx:

public void ProcessRequest(HttpContext context)
{
    string connection = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
    using(var conn = new SqlConnection(connection))
    {
        using (var comm = new SqlCommand("SELECT FileId, [FileName], ContentType, Data FROM Files WHERE FileId=2",conn))
        {
            using(var da = new SqlDataAdapter(comm))
            {
                var dt = new DataTable();
                conn.Open();
                da.Fill(dt);
                conn.Close();
                byte[] Data = (byte[])dt.Rows[0][3];
                context.Response.BinaryWrite(Data);
                context.Response.Flush();
            }

        }
    }
}

【讨论】:

  • 我复制了所有内容,但图像仍然没有显示。是因为我在 的 ImageUrl 吗?
  • 不,你的图片 URL 很好,并且在我这边工作。在string connection 上放置一个断点,当你访问页面时它会被击中吗?代码在哪里失败?
  • 是的,但它是针对与 HandlerImage 无关的代码。你能把你的代码发邮件给我吗?这真的很有帮助。
  • 我已经在答案中发布了我的所有代码,您需要向 public void ProcessRequest(HttpContext context) 添加一个断点并告诉我它是否被击中。
  • 定义“被击中”
猜你喜欢
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2014-10-02
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
相关资源
最近更新 更多