2009-02-20 105 views
5

我有一個簡單的grails文件上傳應用程序。grails base.dir系統屬性

我正在使用transferTo將文件保存到文件系統。

爲了讓我使用

def basePath = System.properties['base.dir'] // HERE IS HOW I GET IT 

     println "Getting new file" 
     println "copying file to "+basePath+"/files" 
     def f = request.getFile('file') 
     def okcontents = ['application/zip','application/x-zip-compressed'] 
     if (! okcontents.contains(f.getContentType())) { 
      flash.message = "File must be of a valid zip archive" 
      render(view:'create', model:[zone:create]) 
      return; 
     } 
       if(!f.empty) { 
        f.transferTo(new File(basePath+"/files/"+zoneInstance.title+".zip")) 
       } 
       else 
       { 
        flash.message = 'file cannot be empty' 
         redirect(action:'upload') 
       } 
     println "Done getting new file" 

出於某種原因,在部署到我WAS 6.1的服務器,這是始終爲空在我的控制器的基本路徑。

爲什麼在運行dev時工作但不在WAS服務器上運行?我應該以不同的方式訪問這些信息嗎?

回答

4

由於Ĵ,

我發現最佳的動態溶液POSS IBLE。通常我不喜歡將絕對路徑編碼到任何軟件中。屬性文件或不。

因此,這裏是它是如何做:

def basePath = grailsAttributes.getApplicationContext().getResource("/files/").getFile().toString() 

grailsAttributes可在任何控制器。

getResource(某些相對目錄)將查找web-app文件夾內的任何內容。

因此,例如,在我開發的系統將的ToString走出去「C:\ WORKSPACEFOLDER \ PROJECTFOLDER \ web應用程序\與concated到底

像這樣在我上面的例子 C中的相關目錄:\ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ files

我在WAS 6.1中試過它,它在容器中工作時沒有任何問題 您必須對其進行測試,否則它將嘗試返回對象。

mugafuga

3

Grails在開發模式下運行時,會爲其Gant腳本和應用程序(包括basedir)提供一整套環境屬性。

看看在grails.batgrails.sh腳本,你會發現這些行:

Unix: -Dbase.dir="." \ 
Windows: set JAVA_OPTS=%JAVA_OPTS% -Dbase.dir="." 

當這些腳本開發模式,你開始你的環境這些免費投入。

當你拿WAR和部署你不再使用這些腳本,因此你需要另一種方式解決問題;您可以

  1. 指定自己的財產,以啓動腳本的應用服務器,例如:-Dbase.dir = /一些/目錄。但是
4

有一個明確的方式...

grailsApplication.parentContext.getResource("dir/or/file").file.toString() 

輸出控制器(例如,引導)?只需注射..

def grailsApplication 

最好的問候!

+0

這是一個更好的方式去比目前公認的答案。 – 2014-11-03 18:21:17

2

另一種選擇:

高清基本路徑= BuildSettingsHolder.settings.baseDir