Как привязать MemoryStream к элементу управления asp:image?
-
09-06-2019 - |
Вопрос
Есть ли способ связать MemoryStream с элементом управления asp:image?
Решение
Обработчик может принимать параметр URL, как и любой другой запрос.Поэтому вместо того, чтобы связывать <asp:image/>
к image.ashx
ты бы установил это на image.ashx?ImageID=[Your image ID here]
.
Другие советы
Лучше всего создать HttpHandler, который будет возвращать изображение.Затем привяжите свойство ImageUrl в asp:Image к URL-адресу HttpHandler.
Вот некоторый код.
Сначала создайте HttpHandler:
<%@ WebHandler Language="C#" Class="ImageHandler" %>
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Web;
public class ImageHandler : IHttpHandler
{
public void ProcessRequest (HttpContext context)
{
context.Response.Clear();
if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
{
int id = Int32.Parse(context.Request.QueryString["id"]);
// Now you have the id, do what you want with it, to get the right image
// More than likely, just pass it to the method, that builds the image
Image image = GetImage(id);
// Of course set this to whatever your format is of the image
context.Response.ContentType = "image/jpeg";
// Save the image to the OutputStream
image.Save(context.Response.OutputStream, ImageFormat.Jpeg);
}
else
{
context.Response.ContentType = "text/html";
context.Response.Write("<p>Need a valid id</p>");
}
}
public bool IsReusable
{
get
{
return false;
}
}
private Image GetImage(int id)
{
// Not sure how you are building your MemoryStream
// Once you have it, you just use the Image class to
// create the image from the stream.
MemoryStream stream = new MemoryStream();
return Image.FromStream(stream);
}
}
Затем просто вызовите его на своей странице aspx, где вы используете asp:Image.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Image ID="myImage" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
</div>
</form>
</body>
</html>
И это все.
Я предполагаю, что вам нужно генерировать динамические изображения из asp.net, вам может повезлоhttp://www.codeplex.com/aspnet/Release/ProjectReleases.aspx?ReleaseId=16449
Хансельман недавно написал об этом в блогеhttp://www.hanselman.com/blog/ASPNETFuturesGeneratingDynamicImagesWithHttpHandlersGetsEasier.aspx
@Уилл и Бен Грисвальд:вместо «image.aspx» используйте «image.ashx».
Он более легкий, чем полная страница ASP.Net, и специально разработан для обработки типов контента, отличных от text/html.
Хотя привязка потока памяти к изображению невозможна, можно использовать Label/GenericControl, некоторый код и схема URI данных для встраивания изображений в страницы, но при таком подходе есть серьезные проблемы:
Недостатки
- Встроенное содержимое необходимо извлечь и декодировать перед внесением изменений, а затем повторно закодировать и повторно внедрить после этого.
- Файлы cookie не поддерживаются.
- Информация, внедренная более одного раза, повторно загружается как часть содержащего файла и, таким образом, не извлекает выгоду из кеша браузера.
- Браузеры могут ограничивать длину URI, создавая эффективный максимальный размер данных.Например, URI в предыдущих версиях Opera имели ограничения в 4 КБ и 32 КБ для IE8 Beta 1.
- Данные включаются в виде простого потока, и многие среды обработки (например, веб-браузеры) могут не поддерживать использование контейнеров (например, multipart/alternative или message/rfc822) для обеспечения большей сложности, например метаданных, сжатия данных или согласования контента.
- Internet Explorer от Microsoft до версии 7 (около 70% рынка по состоянию на второй квартал 2008 г.) не имеет поддержки.
Лучшим подходом является использование отдельной страницы «Image.aspx», которая принимает и выводит ваш MemoryStream, примерно так же, как я это делал в своем программном обеспечении для фотоальбомов, которое я создал, когда начал изучать ASP.net:
(Не смейтесь, это была моя первая попытка создать ASP.net :-)
Редактировать:Согласен с ASHX, приведенный выше код предназначен только для демонстрации одного примера реализации.Когда я приду обновить фотоальбом, он будет использовать для этого ASHX.
Вы можете использовать элемент управления BinaryImage от Telerik для ASP.net.
Больше информации здесь:http://www.telerik.com/products/aspnet-ajax/binaryimage.aspx
Неа.
Но вы можете создать специальную страницу для потоковой передачи этого изображения.Сначала вы устанавливаете URL-адрес изображения для страницы, которая выполняет потоковую передачу, включая некоторые параметры URL-адреса, которые позволяют узнать, где получить изображение:
<img src="GetImage.aspx?filename=foo" ... />
в GetImage.aspx вы получаете имя файла (или что-то еще) из URL-адреса, загружаете изображение в свой MemoryStream, а затем записываете содержимое этого потока памяти непосредственно в HttpResponse:
response.Expires = 0;
response.Buffer = false;
response.Clear();
response.ClearHeaders();
response.ClearContent();
response.ContentType = "image/jpeg";
response.BinaryWrite(stream);
response.Flush();
response.Close();
Мне было необходимо добавить «buffer="false" в @Page.Иначе я бы все время видел одну и ту же картину...