image outputstream nancy

Cómo hacer un controlador de imagen en NancyFx



outputstream (3)

Desde Nancy puedes devolver un nuevo objeto de Response . Su propiedad Content es de tipo Action<Stream> por lo que puede crear un delegado que escriba su matriz de bytes en esa secuencia

var r = new Response(); r.Content = s => { //write to s };

No olvide configurar la propiedad ContentType (puede usar MimeTypes.GetMimeType y pasarle el nombre, incluida la extensión) También hay un StreamResponse , que se hereda de Response y proporciona un constructor diferente (para una sintaxis un poco más agradable que puede usar) return Response.AsStream(..) en tu ruta ... solo sintaxis dulce)

Estoy luchando para generar una imagen de byte [] de mi base de datos en NancyFX a una secuencia de salida web. No tengo código de muestra lo suficientemente cerca como para mostrarlo en este momento. Me preguntaba si alguien ha abordado este problema y podría publicar un fragmento de código. Básicamente, solo quiero devolver la imagen / jpeg desde una matriz de bytes almacenada en mi base de datos y enviarla a la web en lugar de a un archivo físico.


En su controlador, devuelva Response.FromStream con un flujo de bytes de la imagen. Se solía llamar AsStream en versiones anteriores de Nancy.

Get["/Image/{ImageID}"] = parameters => { string ContentType = "image/jpg"; Stream stream = // get a stream from the image. return Response.FromStream(stream, ContentType); };


Solo para construir en la respuesta de @ TheCodeJunkie, puede crear una "respuesta de matriz de bytes" muy fácilmente de la siguiente manera:

public class ByteArrayResponse : Response { /// <summary> /// Byte array response /// </summary> /// <param name="body">Byte array to be the body of the response</param> /// <param name="contentType">Content type to use</param> public ByteArrayResponse(byte[] body, string contentType = null) { this.ContentType = contentType ?? "application/octet-stream"; this.Contents = stream => { using (var writer = new BinaryWriter(stream)) { writer.Write(body); } }; } }

Entonces, si desea utilizar la sintaxis de Response.AsX, es un método de extensión simple en la parte superior:

public static class Extensions { public static Response FromByteArray(this IResponseFormatter formatter, byte[] body, string contentType = null) { return new ByteArrayResponse(body, contentType); } }

Luego en tu ruta puedes usar:

Response.FromByteArray(myImageByteArray, "image/jpeg");

También puede agregar un procesador para usar una matriz de bytes con negociación de contenido. He agregado una muestra rápida de esto a esta idea.