0

webnoirには、ディスクから画像を提供する次の関数があります。

(defpage [:get "/GetPhoto"] {:keys [photoName]}
         (def file (io/input-stream  (str photoName ".jpg")))
         (resp/set-headers {"Content-Type" "image/jpeg"} file))

(.close file)ファイルを閉じる必要があると思いますが、関数の最後に追加するとjava.io.IOException: Stream closed、URLにアクセスするときにエラーが発生します。これを処理する正しい方法は何ですか?

4

2 に答える 2

2

2行目のdefは、おそらくあなたが望むものではありません。with-openステートメントに置き換えることをお勧めします。これは、この関数が実行されるたびに、名前空間全体の新しいシンボルを定義しています。原則として、呼び出しdefはトップレベルまたはマクロ内で使用されます。

(defpage [:get "/GetPhoto"] {:keys [photoName]}
         (with-open [file (io/input-stream  (str photoName ".jpg"))]
           (resp/set-headers {"Content-Type" "image/jpeg"} file))
于 2012-07-30T18:26:10.690 に答える
1

明らかに、関数の最後でファイルを閉じることはできません。noir/ ringで行うのは、応答を説明するデータ構造を返すことだけだからです。次に、Ringはこのデータ構造を使用して、実際にクライアントに応答します。この場合、ストリームを見て、そこから読み取ろうとします。それを閉じると(明示的またはでwith-open)、これは失敗します。

私はあなたが何もする必要がなく、リングがそれを使い果たした後にストリームを閉じることを期待します。

ネストする必要はありませんdef。ネストする必要はありませんdef。ネストする必要はありませんdef。あなたはしたくない...

于 2012-07-31T05:51:42.077 に答える