2015-07-20 35 views
3

我目前正在构建一个Clojure数据库支持的网站上的一个Luminus + h2框架。我在上工作文件上传目前,和卡住在实际上点检索文件。虽然我不能完全肯定这是接近情况的最佳办法,这里是我迄今所做Clojure文件响应

我,让我上传文件的路径。是那些获得上传的文件复制到/资源/公/文件夹我的项目里面:

(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 /公共/文件“)。

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

感谢您的帮助。

+0

您能告诉我们更多的代码吗? – lispHK01

+0

@ lispHK01等什么零件?如果可以的话,可以使用[MCVE](https://stackoverflow.com/help/mcve) – Logan

+0

。你遇到了什么错误? (这个错误是否显示在浏览器中?)另外,当你说“没有我输入整个路径”时,你是什么意思? – lispHK01

回答

1

确定,所以一对夫妇的想法(我不知道什么会适合你的情况最好):

  • 你可以得到进程的当前工作目录,如下所示:

(System/getProperty "user.dir")

  • 你可以改变当前的工作目录,如下所示:

(System/getProperty "user.dir" "https://stackoverflow.com/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多次,您可以使用​​这样做(尽管,标准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

只是要发表评论,并说它是系统/ getProperty - 我看你只是编辑它。这对我来说非常合适,非常感谢!非常熟悉 – Logan