Ángulo de renderizado dynamic: Imagen de la entrada BLOB en ASP.NET

Lo que quiero lograr es esto. Quiero darle al usuario la posibilidad de cargar un archivo de imagen, almacenar la imagen en BLOB en SQL Server y luego usar esta imagen como logotipo en otras páginas del sitio.

Lo he hecho usando

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

pero para hacer esto, utilizo un control de usuario en el lugar donde quiero mostrar la imagen. Quiero hacerlo si es posible usando un asp: control de imagen, o incluso un antiguo control de imagen html. es posible?

Gracias a todos

Agregue un “Manejador genérico” a su proyecto web, asígnele un nombre parecido a Image.ashx. Implementarlo así:

 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; } } } 

Ahora solo implemente el método GetImage para cargar la imagen con la identificación proporcionada, y puede usar

  

para mostrarlo. También puede pensar en implementar alguna forma de almacenamiento en caché en el controlador. Y recuerde que si desea cambiar el formato de imagen a PNG, debe usar un MemoryStream intermedio (porque los PNG requieren una secuencia de búsqueda para guardar).

Puede BASE64 codificar el contenido de la imagen directamente en el atributo SRC, sin embargo, creo que solo Firefox lo analizará de nuevo en una imagen.

Lo que normalmente hago es crear un HTTPHandler muy liviano para servir las imágenes:

 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; } } } } 

Puede hacer referencia a esto directamente en su etiqueta de img:

  

O bien, podría incluso crear un control de servidor que lo haga por usted:

 using System; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace Example.WebControl { [ToolboxData("< {0}:DatabaseImage runat=server>")] 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(""); base.RenderContents(output); } } } 

Esto podría usarse como

 
		      	

No desea publicar blobs desde una base de datos sin implementar el almacenamiento en caché del lado del cliente.

Deberá manejar los siguientes encabezados para admitir el almacenamiento en caché del lado del cliente:

  • ETag
  • Vence
  • Última modificación
  • If-Match
  • If-None-Match
  • If-Modified-Since
  • Si-Sin modificaciones-Desde
  • A menos que-Modificado-Desde

Para un manejador de http que hace esto, consulte: http://code.google.com/p/talifun-web/wiki/StaticFileHandler

Tiene un buen ayudante para servir el contenido. Debería ser fácil pasarle el flujo de la base de datos. También almacena el caché del lado del servidor, lo que debería ayudar a aliviar parte de la presión en la base de datos.

Si alguna vez decide servir contenido de transmisión desde la base de datos, pdfs o archivos de gran tamaño, el controlador también admite 206 solicitudes parciales.

También es compatible con compresión gzip y desinflar.

Estos tipos de archivos se beneficiarán de una mayor compresión:

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

Hay algunos tipos de archivos que no se beneficiarán de una mayor compresión:

  • pdf (causa problemas con ciertas versiones en IE y generalmente está bien comprimido)
  • png, jpg, jpeg, gif, ico
  • wav, mp3, m4a, aac (wav a menudo se comprime)
  • 3gp, 3g2, asf, avi, dv, flv, mov, mp4, mpg, mpeg, wmv
  • zip, rar, 7z, arj

El uso de ASP.Net con MVC es bastante sencillo. Usted codifica un controlador con un método como este:

 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; } 

En su Vista Web ASP.NET o en este ejemplo, en su Formulario Web ASP.NET puede llenar un Control de Imagen con la URL de su método de esta manera:

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

Voilá. No se necesitaba molestia de HttpModules.

De hecho, acabamos de lanzar algunas clases que ayudan con exactamente este tipo de cosas:

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

Específicamente, mira la muestra de DatabaseImage.

Agregue el código a un controlador para devolver los bytes de imagen con el tipo de mime apropiado. Luego puede agregar la url a su controlador como si fuera una imagen. Por ejemplo:

  

¿Tener sentido?