Clojure文件响应

3

目前我正在使用Luminus + h2框架构建一个Clojure数据库支持的网站。我目前正在处理文件上传,并卡在实际检索文件的点上。虽然我不完全确定这是处理这种情况的最佳方法,但是至今为止,以下是我所做的事情

我有一个路由允许我上传文件。上传的文件被复制到我的项目内/resources/public/Files文件夹中:

(io/copy actual-file (io/file "resources" "public" "Files" file-name))

此外,我将每个文件的文件名存储在一个数据库表中,该表使用SQL进行创建和操作。
然后,我有一个新的路由,显示已上传的所有文件的链接(通过访问数据库)。在后端,这些链接将页面导向一个名为“/file/:file-name”的新路由,在其中调用了文件响应函数。我希望这些链接能够作为文件的“下载”功能。
作为我的首次尝试,我将所有文件复制到了我的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中,也能为任何人使用)。但出于某种原因,我似乎无法让文件响应像这样工作。感谢您的帮助。

你能展示更多的代码吗? - user2524973
@lispHK01 像是哪些部分? - Logan
如果可以,请提供一个MCVE。你遇到了什么错误?(这个错误是在浏览器中显示的吗?)另外,当你说“不用我输入整个路径”时,你是什么意思? - user2524973
@lispHK01 我没有收到错误。如果我使用这个代码: (defn files-path-2 [] "/Users/Me/Projects/Three/webdev/resources/public/Files")(defn serve-file [file-name] (file-response (str (files-path-2) File/separator file-name)))那么它会按照我的期望工作。我希望不要像这样明确地写出files-path-2,而是更直接、不特定于我的电脑路径的方式。我正在从three/webdev根文件夹中使用"lein run"命令。我想知道是否有一种方法可以将files-path-2编辑为root/resources/public/Files。 - Logan
好的,听起来你需要一种在运行时修改文件路径变量的方法,可能基于进程的当前工作目录? - user2524973
@lispHK01 是的,那听起来像是一个可能的解决方案。 - Logan
1个回答

1

好的,这里有几个想法(我不确定哪个最适合您的情况):

  • 您可以像这样获得进程的当前工作目录:

(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的“最佳实践”:在依赖于原子之前,请尝试寻找功能/不可变方法)。 可以通过在前面加上@来解除引用原子,例如:
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=>

1
刚想评论一下,说它是 System/getProperty -- 不过我看到你刚刚编辑过了。这对我来说完美地解决了问题,非常感谢!非常感激。 - Logan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接