file - Clojure 文件响应

标签 file clojure upload response

我目前正在 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)/文件”)。

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

感谢您的帮助。

最佳答案

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

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

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

关于file - Clojure 文件响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31521117/

相关文章:

javascript - FileReader.result 返回 null

java - 文件程序显示错误

clojure - 如何使 '() 为零?

clojure - 根据另一个 map 的内容从 map 中删除项目

javascript - 使用javascript在Facebook上上传照片

java - 在java中捕获系统默认编辑器关闭事件

java - 我可以像数组一样从文件中读取对象吗?

clojure - 从Java直接调用 `clojure.lang.Compiler.compile`进行AOT编译Clojure

api - Jim Saunders使用CI Youtube Data Api上传表单

jquery - Django Ajax 表单在 "success"后提交重新加载