5 Stimmen

grails base.dir Systemeigenschaft

Ich habe eine einfache Grails Datei Upload app.

Ich verwende transferTo, um die Datei im Dateisystem zu speichern.

Um den Basispfad in meinem Controller zu erhalten, verwende ich

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"

Aus irgendeinem Grund ist dies immer null, wenn ich es auf meinem WAS 6.1-Server einsetze.

Warum funktioniert es im Dev-Modus, aber nicht im Prod-Modus auf dem WAS-Server? Sollte ich auf diese Informationen auf eine andere Weise zugreifen?

4voto

branchgabriel Punkte 4160

Danke, J,

Ich habe die bestmögliche dynamische Lösung gefunden. In der Regel mag ich es nicht, absolute Pfade in ein Stück Software zu kodieren. Eigenschaftsdatei hin oder her.

Und so wird es gemacht:

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

grailsAttributes ist in jedem Controller verfügbar.

getResource(some relative directory) sucht nach allem, was sich innerhalb des Web-App-Ordners befindet.

In meinem Entwicklungssystem wird es zum Beispiel zu "toString". C:\WORKSPACEFOLDER\PROJECTFOLDER\web -app\ mit dem relativen Verzeichnis am Ende

wie in meinem obigen Beispiel C:\WORKSPACEFOLDER\PROJECTFOLDER\web -App \files

Ich habe es in WAS 6.1 ausprobiert und es funktionierte im Container ohne Probleme. Sie müssen toString es oder es wird versuchen, das Objekt zurückzugeben.

mugafuga

4voto

Wanderson Santos Punkte 2779

Es gibt einen definitiven Weg...

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

Keine Controller mehr vorhanden (z. B. Bootstrap)? Einfach einspritzen

def grailsApplication

Mit freundlichen Grüßen!

3voto

j pimmel Punkte 11593

Wenn Grails im Entwicklungsmodus läuft, stellt es eine ganze Reihe von Umgebungseigenschaften für seine Gant-Skripte und die Anwendung zur Verfügung, einschließlich basedir.

Werfen Sie einen Blick auf die grails.bat o grails.sh Skript und Sie werden diese Zeilen finden:

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

Wenn diese Skripte Ihre Umgebung im Entwicklermodus starten, erhalten Sie diese kostenlos dazu.

Wenn Sie die WAR nehmen und bereitstellen, verwenden Sie diese Skripte nicht mehr und müssen daher das Problem auf andere Weise lösen; Sie können entweder

  1. Geben Sie die Eigenschaft selbst im Startskript für den App-Server an, z. B.: -Dbase.dir=./some/dir aber

2voto

ptsw Punkte 1752

Eine andere Möglichkeit:

def basePath = BuildSettingsHolder.settings.baseDir

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X