2009-02-20 97 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