2009-02-20 8 views
5

Mam prostą aplikację do przesyłania plików grails.grails base.dir system property

Używam transferTo do zapisania pliku w systemie plików.

Aby uzyskać ścieżkę bazową w moim kontrolera używam

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" 

Z jakiegoś powodu to zawsze ma wartość null, gdy rozmieszczony na mój serwer WAS 6.1.

Dlaczego działa podczas pracy z programem, ale nie działa na serwerze WAS? Czy powinienem uzyskiwać dostęp do tych informacji w inny sposób?

Odpowiedz

4

Dzięki J

znalazłem najlepsze dynamiczne rozwiązanie POS ible. Z reguły nigdy nie lubię kodować ścieżek absolutnych w jakimkolwiek oprogramowaniu. Plik właściwości lub nie.

Więc tutaj jest jak to się robi:

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

grailsAttributes jest dostępny w każdym kontrolerze.

getResource (jakiś względny katalog) będzie szukał czegokolwiek w folderze aplikacji internetowych.

Tak na przykład w moim systemie dev będzie toString się do „C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ ze względnym reż concated do końca

podobnie jak w moim przykładzie powyżej C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ files

Próbowałem go w WAS 6.1 i działało w kontenerze bez problemów Musisz to ciągnąć lub spróbuje zwrócić obiekt.

mugafuga

3

Grails, gdy jest uruchamiany w trybie deweloperskim, udostępnia całe mnóstwo właściwości środowiska swoim skryptom Ganta, a także aplikacji z kolei, w tym basedir.

Spójrz na grails.bat lub grails.sh skrypt, a znajdziesz te linie:

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

Kiedy te skrypty uruchomić środowisko w trybie dev dostać te wrzucone za darmo.

Po skorzystaniu z WAR i wdrożeniu nie używasz już tych skryptów i dlatego musisz rozwiązać problem w inny sposób; można albo

  1. Określ właściwość się do skryptu startowego dla serwera aplikacji, np. -Dbase.dir =/some/dir .. jednak
4

Jest ostateczny sposób ...

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

Spośród kontrolerów (np. Bootstrap)? Po prostu wstrzyknij ..

def grailsApplication 

Pozdrawiam!

+0

Jest to lepszy sposób, aby przejść od bieżącej odpowiedzi zaakceptowane. –

2

Inna opcja:

def basePath = BuildSettingsHolder.settings.baseDir