2015-07-20 73 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