как мне извлечь несколько изображений из базы данных с помощью c#

#c# #asp.net #database #image #sqldatareader

#c# #asp.net #База данных #изображение #sqldatareader

Вопрос:

У меня есть база данных из 9 изображений, которые постоянно меняются, поэтому я не могу напрямую установить тег src in html <img> для отображения 9 изображений, я должен выбрать их из базы данных и соответствующим образом привязать.

Я могу извлечь и распечатать 1 изображение, используя Response.BinaryWrite() , но не все 9. Мой byte[] получает только 1-е изображение из базы данных,

вот код,

             while (dr.Read())
            {
                Response.ContentType = "image/jpg";
                Response.BinaryWrite((byte[])(dr["fsImage"]));

            }
  

Как мне извлечь все 9 изображений и как мне привязать их к <asp:Image> тегу или динамически создать HTML <img> -тег

Я новичок, поэтому, пожалуйста, не обижайтесь на меня, если будут глупые ошибки 😉

Заранее спасибо.

Комментарии:

1. Ваша жизнь была бы проще, если бы вы просто сохранили URL в базе данных, а затем установили тег href. Есть ли какая-либо причина, по которой вы не можете сделать это таким образом? Смотрите ниже описание того, как сделать это сложным способом.

2. @Hogan черт возьми, никогда об этом не думал, попробую! любая ссылка для решения моей проблемы будет очень полезна!

Ответ №1:

Вы не можете предоставить веб-странице содержимое всех изображений.

Для того, чтобы «динамически» отображать изображение, вам нужно создать страницу, которая предоставит вам одно изображение. На этой странице будет использоваться код, подобный приведенному выше.

Затем, чтобы выбрать, какое изображение показывать, URL-адрес страницы изменился бы, например

 http://youdomain/makeimage.aspx?imageid=1
  

и

 http://youdomain/makeimage.aspx?imageid=2
  

Затем код в make image вернет единственное изображение.

Примечание — вы будете намного счастливее, если создадите URL

 http://youdomain/makeimage.aspx?imageid=1amp;mytype=.jpg
  

Таким образом, URL-адрес изображения заканчивается расширением. Некоторые браузеры (IE) обманывают и смотрят в конец строки, чтобы увидеть, какой тип контента ожидать. Они будут работать с URL, подобным приведенному выше, но не без trialling .jpg.

Кроме того, вам нужно будет реализовать некоторую форму кэширования, чтобы ваша производительность была максимальной (особенно, если вы попытаетесь масштабировать.)

Удачи.

Комментарии:

1. Подход, который я бы тоже выбрал. Одно замечание, однако, указание типа mime сделало бы все браузеры счастливыми и не требовало бы «.jpg» в конце

2. @paan — не мой опыт — в некоторых браузерах все еще были проблемы. Да, вы также должны указать тип mime. Это во всех примерах — я приводил примечание о труднодоступной проблеме.

3. Отмечено. Возможно, у меня никогда не было никаких проблем с этим. Вы правы. Простые дополнительные шаги для обеспечения совместимости всегда хороши в Интернете

Ответ №2:

Используйте HttpHandler и вызовите тег Img

один пример

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

using System;
using System.Web;
using System.Data.SqlClient;
using System.Data;
using System.Configuration;


public class Handler2 : IHttpHandler {


    public void ProcessRequest(HttpContext context)
    {

        if (context.Request.QueryString["pid"] != null)
        {
            string ID = context.Request.QueryString["pid"].ToString();

            if (dt.Rows.Count > 0)
            {
                int pid = Convert.ToInt32(ID);
                SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ConnectionString);
                myConnection.Open();
                //int i = Convert.ToInt32(context.Request.QueryString["id"]);
                string sql = "Select BackGroundImage from Wall_BackgrndImg_Master where FK_Company_Master=@ImageId";
                SqlCommand cmd = new SqlCommand(sql, myConnection);
                cmd.Parameters.Add("@ImageId", SqlDbType.Int).Value = pid;
                cmd.Prepare();
                SqlDataReader dr = cmd.ExecuteReader();
                dr.Read();
                try
                {
                    context.Response.ContentType = "jpg";
                    context.Response.BinaryWrite((byte[])dr["BackGroundImage"]);
                    dr.Close();
                    myConnection.Close();
                }
                catch
                {

                }
            }
        }

    }

    public bool IsReusable {
        get {
            return false;
        }
    }

}
  

и вызвать, как

     <img src="~/handlor.ashx?pid=1">
<img src="~/handlor.ashx?pid=2">
<img src="~/handlor.ashx?pid=3">
<img src="~/handlor.ashx?pid=4">
<img src="~/handlor.ashx?pid=5">
  

Комментарии:

1. Это лучшее решение, чем страница aspx.