我有一个简单的grails文件上传应用程序。
我正在使用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服务器上没有prod时它可以工作?我应该以不同的方式访问这些信息吗?
答案 0 :(得分:4)
谢谢j,
我找到了最好的动态解决方案。作为一项规则,我从不喜欢将绝对路径编码到任何软件中。属性文件或否。
所以这是如何完成的:
def basePath = grailsAttributes.getApplicationContext().getResource("/files/").getFile().toString()
grailsAttributes可在任何控制器中使用。
getResource(一些相对目录)将在web-app文件夹中查找任何内容。
因此,例如在我的开发系统中,它将切换到“C:\ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \,相对dir合并到最后
在上面的例子中是这样的 C:\ WORKSPACEFOLDER \ PROJECTFOLDER \ web应用\文件
我在WAS 6.1中尝试过,它在容器中工作没有问题。 你必须toString它或它将尝试返回对象。
mugafuga
答案 1 :(得分:4)
有一种明确的方式......
grailsApplication.parentContext.getResource("dir/or/file").file.toString()
控制器外(例如bootstrap)?刚注射..
def grailsApplication
祝你好运!
答案 2 :(得分:3)
Grails,当它以开发模式运行时,依次为其Gant脚本和应用程序提供了大量环境属性,包括basedir。
查看 grails.bat 或 grails.sh 脚本,您会发现这些行:
Unix: -Dbase.dir="." \
Windows: set JAVA_OPTS=%JAVA_OPTS% -Dbase.dir="."
当这些脚本以开发模式启动您的环境时,您可以免费获得这些脚本。
当您使用WAR并部署时,您不再使用这些脚本,因此您需要以另一种方式解决问题;你可以
答案 3 :(得分:2)
另一种选择:
def basePath = BuildSettingsHolder.settings.baseDir