Сведения о вопросе

FromRussia

22:42, 9th August, 2020

Теги

asp.net    

Динамический рендеринг asp:Image из BLOB записи в ASP.NET

Просмотров: 419   Ответов: 6

Вот чего я хочу добиться. Я хочу дать пользователю возможность загрузить файл изображения, сохранить изображение в BLOB на сервере SQL, а затем использовать это изображение в качестве логотипа на других страницах сайта.

Я сделал это с помощью

   Response.Clear();
   Response.ContentType = "image/pjpeg";
   Response.BinaryWrite(imageConents);
   Response.End();

но для этого я использую пользовательский элемент управления в том месте, где я хочу показать изображение. Я хочу сделать это, если это возможно, используя элемент управления asp:Image или даже чистый старый элемент управления html image. Разве это возможно?



  Сведения об ответе

P_S_S

21:06, 1st October, 2020

Добавьте 'Generic Handler' в свой веб-проект, назовите его как-то вроде Image.ashx. Реализуйте его следующим образом:

public class ImageHandler : IHttpHandler
{

    public void ProcessRequest(HttpContext context)
    {
        using(Image image = GetImage(context.Request.QueryString["ID"]))
        {    
            context.Response.ContentType = "image/jpeg";
            image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
        }
    }

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

Теперь просто реализуйте метод GetImage, чтобы загрузить изображение с заданным ID, и вы можете использовать

<asp:Image runat="server" ImageUrl="~/Image.ashx?ID=myImageId" /> 

отобразить ее. Вы также можете подумать о реализации некоторой формы кэширования в обработчике. И помните, если вы хотите изменить формат изображения на PNG, вам нужно использовать промежуточный MemoryStream (потому что PNGs требует сохранения искомого потока).


  Сведения об ответе

crush

15:31, 9th August, 2020

Вы можете BASE64 кодировать содержимое изображения непосредственно в атрибут SRC, однако я полагаю, что только Firefox будет анализировать это обратно в изображение.

Что я обычно делаю, так это создаю очень легкий HTTPHandler для обслуживания изображений:

using System;
using System.Web;

namespace Example
{  
    public class GetImage : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            if (context.Request.QueryString("id") != null)
            {
                Blob = GetBlobFromDataBase(id);
                context.Response.Clear();
                context.Response.ContentType = "image/pjpeg";
                context.Response.BinaryWrite(Blob);
                context.Response.End();
            }
        }

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

Вы можете ссылаться на это непосредственно в своем теге img:

<img src="GetImage.ashx?id=111"/>

Или вы можете даже создать серверный элемент управления, который делает это за вас:

using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace Example.WebControl
{

    [ToolboxData("<{0}:DatabaseImage runat=server></{0}:DatabaseImage>")]
    public class DatabaseImage : Control
    {

        public int DatabaseId
        {
            get
            {
                if (ViewState["DatabaseId" + this.ID] == null)
                    return 0;
                else
                    return ViewState["DataBaseId"];
            }
            set
            {
                ViewState["DatabaseId" + this.ID] = value;
            }
        }

        protected override void RenderContents(HtmlTextWriter output)
        {
            output.Write("<img src='getImage.ashx?id=" + this.DatabaseId + "'/>");
            base.RenderContents(output);
        }
    }
}

Это может быть использовано как

<cc:DatabaseImage id="db1" DatabaseId="123" runat="server/>

И, конечно, вы можете установить databaseId в кодовом поиске по мере необходимости.


  Сведения об ответе

DO__IT

18:15, 12th August, 2020

Вы не хотите обслуживать большие двоичные объекты из базы данных без реализации кэширования на стороне клиента.

Для поддержки кэширования на стороне клиента вам потребуется обработать следующие заголовки:

  • ETag
  • Истекает
  • Последнее Изменение
  • Если-Совпадение
  • If-None-Match
  • If-Modified-Since
  • If-Unmodified-Since
  • Unless-Modified-Since

Для обработчика http, который делает это, проверьте: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

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

Если вы когда-нибудь решите обслуживать потоковое содержимое из базы данных, PDF-файлов или больших файлов, обработчик также поддерживает 206 частичных запросов.

Он также поддерживает gzip и сдувает сжатие.

Эти типы файлов выиграют от дальнейшего сжатия:

  • css, js, htm, html, swf, xml, xslt, txt
  • doc, xls, ppt

Есть некоторые типы файлов, которые не выиграют от дальнейшего сжатия:

  • pdf (вызывает проблемы с некоторыми версиями в IE и обычно хорошо сжимается)
  • png, формат JPG, jpeg, МФП, МГО
  • wav, mp3, m4a, aac (wav часто сжимается)
  • 3gp, 3g2, asf, avi, dv, flv, mov, mp4, mpg, mpeg, wmv
  • zip, rar, 7z, arj


  Сведения об ответе

fo_I_K

20:47, 24th August, 2020

Используя ASP.Net с MVC, это довольно просто. Вы кодируете контроллер с помощью такого метода:

public FileContentResult Image(int id)
{
    //Get data from database. The Image BLOB is return like byte[]
    SomeLogic ItemsDB= new SomeLogic("[ImageId]=" + id.ToString());
    FileContentResult MyImage = null;
    if (ItemsDB.Count > 0)
    {
        MyImage= new FileContentResult(ItemsDB.Image, "image/jpg");
    }

    return MyImage;
}

В веб-представлении ASP.NET или в этом примере в веб-форме ASP.NET можно заполнить элемент управления изображением с помощью URL для вашего метода следующим образом:

            this.imgExample.ImageUrl = "~/Items/Image/" + MyItem.Id.ToString();
            this.imgExample.Height = new Unit(120);
            this.imgExample.Width = new Unit(120);

Вот. Не так уж много хлопот было нужно.


  Сведения об ответе

lesha

05:41, 29th August, 2020

Мы на самом деле только что выпустили несколько классов, которые помогают именно с такими вещами:

http://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449

В частности, проверьте образец DatabaseImage.


  Сведения об ответе

repe

16:09, 12th August, 2020

Добавьте код в обработчик, чтобы вернуть байты изображения с соответствующим типом mime. Затем вы можете просто добавить url в свой обработчик, как это изображение. Например:

<img src="myhandler.ashx?imageid=5">  

В этом есть смысл?


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться