Clojure 文件响应
Clojure File Response
我目前正在 Clojure 数据库支持的网站上构建 Luminus +h2 框架。我目前正在处理 文件上传,卡住 实际上检索文件。虽然我不完全确定这是处理这种情况的最佳方法,这是我目前所做的:
我有一个允许我上传文件的路径。上传的文件被复制到我项目中的 /resources/public/Files 文件夹:
(io/copy actual-file (io/file "resources" "public" "Files" file-name))
此外,我将每个文件的文件名存储在使用[=54创建和操作的数据库table中=].
然后我有一条新路线,它显示所有已上传为链接的文件(通过访问数据库)。在后端,链接将页面定向到调用文件响应函数的新路径“/file/:file-name”。我希望这些链接可以作为文件的 "downloads" 使用。
作为我在这项工作中的第一次尝试,我将所有文件复制到我的 C:/AllFiles 文件夹,然后这样做:
(defn serve-file [file-name]
(file-response (str (files-path) File/separator file-name)))
其中文件路径是:
(defn files-path [] "/AllFiles")
这实际上对我有用。但是,我希望我正在使用的文件是我特定项目目录中的文件,而不必键入整个路径(即它适用于使用它的任何人,位于 ~/Project-Name/resources/public/Files").
出于某种原因,我似乎无法让文件响应像这样工作。
感谢您的帮助。
好吧,有几个想法(我不确定什么最适合你的情况):
- 您可以像这样获取进程的当前工作目录:
(System/getProperty "user.dir")
- 您可以像这样更改当前工作目录:
(System/getProperty "user.dir" "/users/lispHK01")
所以你可能会做这样的事情:
(def initial-working-path (System/getProperty "user.dir"))
(def my-relative-files-path "foo/bar/wherefileswillbe")
(def files-path
(str
initial-working-path
File/separator
my-relative-files-path))
如果您需要多次更新 files-path
,您可以使用 atom
来执行此操作(不过,标准 Clojure 'best practices' 免责声明:尝试寻找 functional/immutable 在依赖原子之前的方法)。通过在前面加上 @
来取消引用原子,例如:
user=> (def foo (atom "my/path"))
#'user/foo
user=> @foo
"my/path"
user=> (reset! foo "my/new/path")
"my/new/path"
user=> @foo
"my/new/path"
user=>
我目前正在 Clojure 数据库支持的网站上构建 Luminus +h2 框架。我目前正在处理 文件上传,卡住 实际上检索文件。虽然我不完全确定这是处理这种情况的最佳方法,这是我目前所做的:
我有一个允许我上传文件的路径。上传的文件被复制到我项目中的 /resources/public/Files 文件夹:
(io/copy actual-file (io/file "resources" "public" "Files" file-name))
此外,我将每个文件的文件名存储在使用[=54创建和操作的数据库table中=].
然后我有一条新路线,它显示所有已上传为链接的文件(通过访问数据库)。在后端,链接将页面定向到调用文件响应函数的新路径“/file/:file-name”。我希望这些链接可以作为文件的 "downloads" 使用。
作为我在这项工作中的第一次尝试,我将所有文件复制到我的 C:/AllFiles 文件夹,然后这样做:
(defn serve-file [file-name]
(file-response (str (files-path) File/separator file-name)))
其中文件路径是:
(defn files-path [] "/AllFiles")
这实际上对我有用。但是,我希望我正在使用的文件是我特定项目目录中的文件,而不必键入整个路径(即它适用于使用它的任何人,位于 ~/Project-Name/resources/public/Files").
出于某种原因,我似乎无法让文件响应像这样工作。
感谢您的帮助。
好吧,有几个想法(我不确定什么最适合你的情况):
- 您可以像这样获取进程的当前工作目录:
(System/getProperty "user.dir")
- 您可以像这样更改当前工作目录:
(System/getProperty "user.dir" "/users/lispHK01")
所以你可能会做这样的事情:
(def initial-working-path (System/getProperty "user.dir"))
(def my-relative-files-path "foo/bar/wherefileswillbe")
(def files-path
(str
initial-working-path
File/separator
my-relative-files-path))
如果您需要多次更新 files-path
,您可以使用 atom
来执行此操作(不过,标准 Clojure 'best practices' 免责声明:尝试寻找 functional/immutable 在依赖原子之前的方法)。通过在前面加上 @
来取消引用原子,例如:
user=> (def foo (atom "my/path"))
#'user/foo
user=> @foo
"my/path"
user=> (reset! foo "my/new/path")
"my/new/path"
user=> @foo
"my/new/path"
user=>