关闭clojure / webnoir中的服务文件

时间:2012-07-30 17:44:52

标签: clojure noir

我在webnoir中有以下功能,用于从磁盘提供图像。

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

我假设我应该关闭该文件,但是当我在函数末尾添加(.close file)时,访问URL时出现错误java.io.IOException: Stream closed。处理这个问题的正确方法是什么?

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:1)

显然你不能在函数结束时关闭文件,因为你用noir / ring做的只是返回一个描述响应的数据结构。然后,Ring使用此数据结构实际响应客户端。在这种情况下,它会看到一个流并尝试从中读取。当你关闭它时(显式或with-open),这将失败。

我希望你不必做任何事情,并且在用完之后响铃会关闭它。

您不希望嵌套def。您不希望嵌套def。您不希望嵌套def。你不想......