Потоковый байт [] для изображения в ASP.NET C # - PullRequest
5 голосов
/ 28 августа 2009

У меня есть изображение, хранящееся в моей базе данных SQL Server, где хранятся мои данные пользователя, которые я извлекаю одновременно

Теперь у меня есть байт [] прямо на странице, на которой я хочу его показать. Как мне поместить это в мой WebControls.Image? Я не хочу вызывать HttpHandler и снова вызывать базу данных.

Это, очевидно, просто выводит его на всю страницу.

            Context.Response.BinaryWrite(user.Picture.ToArray());

Ответы [ 5 ]

4 голосов
/ 28 августа 2009

Если это маленькое изображение, вы бы вывели его в виде кодированных в base64 данных в тег изображения Смотрите здесь для аналогичной ситуации .

Но в 99,9% всех ситуаций вы бы создали HttpHandler, который возвращает изображение. Я думаю, это самый простой и быстрый способ сделать это.

1 голос
/ 28 августа 2009

Оберните байтовый массив в объект MemoryStream и поместите его в ASP.NETs Cache.

MemoryStream ms = new MemoryStream(user.Picture.ToArray());
Guid imageGuid = new Guid();
HttpRuntime.Cache.Add(imageGuid.ToString(), ms, null,
    DateTime.Now.AddMinutes(5), Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);

Затем используйте обработчик (.ashx), чтобы извлечь его из кэша и отправить клиенту.

string imageGuid = context.Request.QueryString[image];
MemoryStream ms = (MemoryStream)HttpRuntime.Cache[imageGuid];
// configure context.Response with appropriate content type and cache settings

// ** Edit **
// It seems I need to be more explicit with regard to the above comment:-
context.Response.Cache.SetCacheability(HttpCacheability.Public);
context.Response.Cache.SetLastModified(DateTime.UtcNow);
context.Response.Cache.SetExpires(DateTime.UtcNow.AddHours(2);
context.Response.Cache.SetMaxAge(TimeSpan.FromHours(2));
context.Response.Cache.SetValidUntilExpires(true);

ms.WriteTo(context.Response.OutputStream);

Теперь вы можете удалить MemoryStream из кеша.

HttpRuntime.Cache.Remove(imageGuid);
0 голосов
/ 28 августа 2009

Я почти уверен, что вы не можете сделать это на самой странице.

Если вы не хотите создавать обработчик HTTP для вывода изображения, тогда вы можете создать отдельную страницу aspx. Установите src вашего тега img так, чтобы он указывал на эту страницу, передавая некоторый идентификатор в строку запроса, чтобы данные изображения можно было извлечь из базы данных.

Сказав это, настроить страницу aspx, чтобы сделать это, не быстрее и не проще, чем настроить ashx. Я бы порекомендовал сделать это правильный способ и создать обработчик HTTP.

0 голосов
/ 28 августа 2009

Вам нужен IHttpHander, который запишет байты изображения и правильный Content-Type в поток ответа. См. это , это и это .

0 голосов
/ 28 августа 2009

создайте отдельную страницу, на которой вы создадите изображение, например: image.aspx и использовать его на других страницах

<img src="image.aspx?id=number" >

число - идентификатор изображения в базе данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...