我很难将NancyFX中我的数据库中的byte []输出到Web输出流。我没有示例代码足够接近甚至在此时显示。我想知道是否有人解决了这个问题并且可以发布一个片段?我基本上只想从存储在我的数据库中的字节数组中返回image / jpeg,然后将其放到Web而不是物理文件中。
答案 0 :(得分: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");
你也可以添加一个处理器来使用带有内容协商的字节数组,我已经添加了一个快速的样本到this gist
答案 1 :(得分: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);
};
答案 2 :(得分:8)
从Nancy您可以返回一个新的Response
对象。它的Content
属性类型为Action<Stream>
,因此您只需创建一个将字节数组写入该流的委托
var r = new Response();
r.Content = s => {
//write to s
};
不要忘记设置ContentType
属性(您可以使用MimeTypes.GetMimeType
并传递名称,包括扩展名)还有StreamResponse
,它继承自Response
{1}}并提供了一个不同的构造函数(对于一个更好的语法,你可以在你的路由中使用return Response.AsStream(..)
..只是语法糖果)