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

第二行的 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)时,这将失败。

我希望您不必做任何事情,并且 ring 会在用尽后关闭流。

你不想嵌套def. 你不想嵌套def. 你不想嵌套def. 你不想...

于 2012-07-31T05:51:42.077 回答