File Clojure文件响应

File Clojure文件响应,file,clojure,upload,response,File,Clojure,Upload,Response,我目前正在一个Luminus+h2框架上构建一个Clojure数据库支持的网站。我目前正在进行文件上传,并且一直停留在实际检索文件的阶段。虽然我不完全确定这是解决这种情况的最佳方法,但以下是我迄今为止所做的: 我有一条上传文件的路线。上载的文件将复制到我的项目中的/resources/public/files文件夹: (io/copy actual-file (io/file "resources" "public" "Files" file-name)) 此外,我将每个文件的文件名存储在使用

我目前正在一个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),这样任何使用它的人都可以使用它

出于某种原因,我似乎无法让文件响应像这样工作

谢谢你的帮助。

好的,有几个想法(我不确定什么最适合你的情况):

  • 您可以按如下方式获取进程的当前工作目录:
(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))
如果您需要多次更新
文件路径
,您可以使用
atom
来完成此操作(不过,标准Clojure“最佳实践”免责声明:在依赖atom之前,尝试寻找一种功能性/不可变的方法)。atom是通过使用
@
前缀来取消的,例如:

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=>

你能给我们看更多你的代码吗?@lispHK01,比如什么部分?如果可以的话。你得到了什么错误?(这个错误在浏览器中显示了吗?)还有,你说“不用我键入整个路径”是什么意思?@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像这样写出来,而是更直接、更不特定于我自己的计算机的路径“从三个/webdev根文件夹。我想知道是否有一种方法可以将files-path-2改为root/resources/public/files,可能是基于进程的当前工作目录?只是要注释并说它是System/getProperty——我看到您刚刚编辑了它。这对我来说非常有效,非常感谢!非常感谢