2013-01-23 2 views
18

NancyFXのデータベースからbyte []の画像をWeb出力ストリームに出力するのには苦労しています。この時点で表示するにはサンプルコードを十分に近づけていません。誰かがこの問題に取り組み、スニペットを投稿できるかどうか疑問に思っていましたか?私は基本的には、私のデータベースに格納されたバイト配列からimage/jpegを返し、物理ファイルではなくウェブに出力したいだけです。NancyFxで画像ハンドラを作成する方法

答えて

27

のために(別のコンストラクタを提供してもStreamResponseあり拡張子)は、ちょうどあなたがすることができ、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

+0

ソリューションを拡張していただきありがとうございます。 – sethxian

+0

リクエストのバイト配列レスポンスをブラウザキャッシュにする方法はありますか?ハンドラは同じURLに対して再び動作しないように? – Azadrum

+1

それはひどいです、そのキャッシュはメモリ内のバイトです。最小限のメモリを使用して直接ストリームできませんか? – Todd

8

Nancyから新しいResponseオブジェクトを返すことができます。それはContentプロパティがタイプAction<Stream>でありますので、あなただけの

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

を含む、(あなたがMimeTypes.GetMimeTypeを使用して、名前を渡すことができContentTypeプロパティを設定することを忘れないでください、そのストリームに、あなたのバイト配列を書き込みデリゲートを作成することができますResponseから継承し、あなたのルートでreturn Response.AsStream(..)を使用することができますビットよりよい構文..ちょうど構文キャンディー)

+0

助けてくれてありがとう、私はあなたが提示した代替ソリューションが好きです。 – sethxian

+0

プロパティ名が 'Contents'に変更されたように見えます。 – TrueWill

11

Inあなたのコントローラは、イメージのバイトストリームで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); 
}; 
+0

このAPIを使用してソースストリームをどのように閉じなければなりませんか?恐ろしい。 – Todd

+2

ソースストリームは後で自動的に処理されます-https://github.com/NancyFx/Nancy/issues/786 – Todd

+1

ストリーム位置がストリームの先頭に設定されていることを確認する必要があります: 'stream.Seek(0、 SeekOrigin.Begin) '、' FromStream'はあなたのためにそれをしません。 –

関連する問題