Извлечение файла изображения из базы данных и отображение на веб-странице в Asp.Net
Я пытаюсь отобразить изображение из базы данных на веб-странице 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>
Любая помощь будет оценена.
2 ответа
Создайте страницу для изображения, скажем 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"/>
В вашей таблице SQL есть 4 столбца files
:
- FILEID
- Имя файла
- Тип содержимого
- Данные
Но в вашем коде 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();
}
}
}
}