Подтвердить что ты не робот

Как сделать обработчик изображения в NancyFx

Я пытаюсь вывести Image from byte [] из своей базы данных в NancyFX в поток веб-вывода. У меня нет образца кода достаточно близко, чтобы даже показать на этом этапе. Мне было интересно, если кто-нибудь решит эту проблему и может опубликовать фрагмент? Я просто хочу вернуть image/jpeg из массива байтов, хранящегося в моей базе данных, и вынести его в Интернет, а не в физический файл.

4b9b3361

Ответ 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(..) в своем маршруте.. просто синтаксическая конфета)