20

我正在努力将来自 NancyFX 数据库中的 byte[] 的图像输出到 Web 输出流。我没有足够接近的示例代码,甚至无法在这一点上显示。我想知道是否有人解决了这个问题并可以发布一个片段?我基本上只想从存储在我的数据库中的字节数组中返回图像/jpeg,然后将其放到网络上而不是物理文件中。

4

3 回答 3

30

只是以@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");

您还可以添加一个处理器以使用字节数组进行内容协商,我已在此要点中添加了一个快速示例

于 2013-01-23T08:14:09.513 回答
12

在您的控制器中,返回带有图像字节流的 Response.FromStream。在旧版本的 nancy 中,它曾经被称为 AsStream。

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

     return Response.FromStream(stream, ContentType);
};
于 2015-02-20T07:43:56.920 回答
8

您可以从 Nancy 返回一个新Response对象。它的Content属性是类型Action<Stream>,因此您可以创建一个委托,将您的字节数组写入该流

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

不要忘记设置ContentType属性(您可以使用MimeTypes.GetMimeType并将名称传递给它,包括扩展名)还有一个StreamResponse, 继承自Response并提供不同的构造函数(您可以在路由中使用更好的语法return Response.AsStream(..)......只是语法糖果)

于 2013-01-23T06:52:54.777 回答