2009-02-20 40 views
5

Tôi có ứng dụng tải lên tệp grails đơn giản.grails base.dir thuộc tính hệ thống

Tôi đang sử dụng transferTo để lưu tệp vào hệ thống tệp.

Để có được con đường cơ bản trong điều khiển của tôi Tôi đang sử dụng

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" 

Đối với một số lý do này luôn là null khi triển khai để tôi WS 6.1 máy chủ.

Tại sao nó hoạt động khi chạy dev nhưng không hoạt động trên máy chủ WS? Tôi có nên truy cập thông tin này theo cách khác không?

Trả lời

4

Cảm ơn j,

tôi tìm thấy poss giải pháp năng động nhất ible. Theo quy tắc, tôi không bao giờ muốn viết mã đường dẫn tuyệt đối vào bất kỳ phần mềm nào. Tệp thuộc tính hoặc không.

Vì vậy, đây là cách nó được thực hiện:

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

grailsAttributes có sẵn trong bất kỳ bộ điều khiển.

getResource (một số thư mục tương đối) sẽ tìm kiếm mọi thứ bên trong thư mục web-app.

Vì vậy, ví dụ như trong hệ thống dev của tôi nó sẽ toString ra "C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ với dir tương concated đến cuối

như vậy trong ví dụ của tôi ở trên C: \ WORKSPACEFOLDER \ PROJECTFOLDER \ web-app \ files

Tôi đã thử nó trong WS 6.1 và nó đã làm việc trong thùng chứa không có vấn đề Bạn phải toString nó hoặc nó sẽ cố gắng trả lại đối tượng.

mugafuga

3

Grails, khi nó chạy trong chế độ dev, cung cấp một loạt các thuộc tính môi trường cho các kịch bản Gant và ứng dụng của nó lần lượt, bao gồm cả basedir.

Hãy nhìn vào các grails.bat hoặc grails.sh kịch bản và bạn sẽ tìm thấy những dòng này:

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

Khi các kịch bản khởi động môi trường của bạn trong chế độ dev bạn nhận được chúng được ném miễn phí.

Khi bạn thực hiện WAR và triển khai, bạn không còn sử dụng các tập lệnh này nữa và do đó bạn cần giải quyết vấn đề theo cách khác; bạn có thể

  1. Xác định tài sản cho mình để kịch bản khởi động cho máy chủ ứng dụng, ví dụ như:. -Dbase.dir =/some/dir .. Tuy nhiên
4

Có một cách dứt khoát ...

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

Out of khiển (ví dụ. Bootstrap)? Chỉ cần tiêm ..

def grailsApplication 

Trân trọng!

+0

Đây là một cách tốt hơn để đi hơn câu trả lời được chấp nhận hiện nay. –

2

Một tùy chọn khác:

def basePath = BuildSettingsHolder.settings.baseDir

Các vấn đề liên quan