2009-02-20 16 views
5

Ho una semplice app per caricare file di Grails.grails base.dir proprietà di sistema

Sto utilizzando transferTo per salvare il file nel file system.

per ottenere il percorso base nel mio controller sto usando

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" 

Per qualche ragione questo è sempre nullo quando schierato al mio WAS 6.1 del server.

Perché funziona quando si esegue dev ma non in prod sul server WAS? Dovrei accedere a queste informazioni in un modo diverso?

risposta

4

Grazie j,

ho trovato la migliore soluzione poss dinamico bile. Di regola non mi piace mai codificare percorsi assoluti in qualsiasi software. File di proprietà o no.

: ecco come è fatto:

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

grailsAttributes è disponibile in qualsiasi controller.

getResource (una directory relativa) cercherà qualsiasi cosa all'interno della cartella dell'app Web.

Così, per esempio nel mio sistema dev che verrà toString fuori a "C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ con la dir relativa concated alla fine

in questo modo nel mio esempio sopra C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ files

L'ho provato in WAS 6.1 e ha funzionato nel contenitore senza problemi Devi stringarlo o proverà a restituire l'oggetto.

mugafuga

3

Grails, quando viene eseguito in modalità dev, fornisce un'intera serie di proprietà dell'ambiente agli script Gant e all'app a sua volta, incluso basedir.

Date un'occhiata al grails.bat o grails.sh sceneggiatura e troverete queste righe:

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

Quando questi script può avviare l'ambiente in modalità dev si ottiene questi gettati gratis.

Quando si prende WAR e si distribuisce, non si usano più questi script e quindi è necessario risolvere il problema in un altro modo; è possibile

  1. Specificare se stessi la proprietà per lo script di avvio del server app, ad esempio:. -Dbase.dir =/some/dir .. però
4

C'è un modo definitivo ...

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

Out of controllori (es. Bootstrap)? Basta iniettare ..

def grailsApplication 

Cordiali saluti!

+0

Questo è un modo migliore per andare oltre la risposta accettata corrente. –

2

Un'altra opzione:

def basePath = BuildSettingsHolder.settings.baseDir

Problemi correlati