Я пытаюсь вывести Image from byte [] из своей базы данных в NancyFX в поток веб-вывода. У меня нет образца кода достаточно близко, чтобы даже показать на этом этапе. Мне было интересно, если кто-нибудь решит эту проблему и может опубликовать фрагмент? Я просто хочу вернуть image/jpeg из массива байтов, хранящегося в моей базе данных, и вынести его в Интернет, а не в физический файл.
Как сделать обработчик изображения в NancyFx
Ответ 1
Просто чтобы построить ответ @TheCodeJunkie, вы можете построить "ответ массива байтов" очень легко:
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);
}
};
}
}
Затем, если вы хотите использовать синтаксис Response.AsX, это простой метод расширения сверху:
public static class Extensions
{
public static Response FromByteArray(this IResponseFormatter formatter, byte[] body, string contentType = null)
{
return new ByteArrayResponse(body, contentType);
}
}
Затем на вашем маршруте вы можете просто использовать:
Response.FromByteArray(myImageByteArray, "image/jpeg");
Вы также можете добавить процессор для использования массива байтов с согласованием содержимого, я добавил быстрый пример этого этого метода
Ответ 2
В вашем контроллере верните Response.FromStream с потоком байтов изображения. Раньше его называли AsStream в более старых версиях nancy.
Get["/Image/{ImageID}"] = parameters =>
{
string ContentType = "image/jpg";
Stream stream = // get a stream from the image.
return Response.FromStream(stream, ContentType);
};
Ответ 3
Из Nancy вы можете вернуть новый объект Response
. Свойство Content
имеет тип Action<Stream>
, поэтому вы можете просто создать делегат, который записывает ваш массив байтов в этот поток
var r = new Response();
r.Content = s => {
//write to s
};
Не забудьте установить свойство ContentType
(вы можете использовать MimeTypes.GetMimeType
и передать ему имя, включая расширение). Существует также StreamResponse
, который наследует от Response
и предоставляет другой конструктор ( для немного более сильного синтаксиса вы можете использовать return Response.AsStream(..)
в своем маршруте.. просто синтаксическая конфета)