我在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
。处理这个问题的正确方法是什么?
答案 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
。你不想......