2009-02-20 10 views
5

मेरे पास एक साधारण grails फ़ाइल अपलोड ऐप है।grails base.dir सिस्टम प्रॉपर्टी

मैं फ़ाइल सिस्टम में फ़ाइल को सहेजने के लिए स्थानांतरण का उपयोग कर रहा हूं।

मेरी नियंत्रक में आधार पथ प्राप्त करने के लिए मैं

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" 

उपयोग कर रहा हूँ किसी कारण से यह हमेशा अशक्त जब तैनात मेरी था 6.1 सर्वर है।

डब्ल्यूएएस सर्वर पर प्रोड में नहीं बल्कि dev चलाने पर यह क्यों काम करता है? क्या मुझे इस जानकारी को एक अलग तरीके से एक्सेस करना चाहिए?

उत्तर

4

धन्यवाद जे के लिए अनुमति देता है,

मैं सबसे अच्छा गतिशील समाधान poss पाया उपयोग करने के लिए ible। एक नियम के रूप में मैं कभी भी सॉफ्टवेयर के किसी भी हिस्से में पूर्ण पथ को कोड करना पसंद नहीं करता हूं। संपत्ति फ़ाइल या नहीं।

तो यहाँ है कि यह कैसे किया जाता है:

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

grailsAttributes किसी भी नियंत्रक में उपलब्ध है।

getResource (कुछ सापेक्ष डीआईआर) वेब-ऐप फ़ोल्डर के अंदर कुछ भी ढूंढेंगे। सेल्सियस से ऊपर मेरे उदाहरण में तो जैसे अंत

को concated रिश्तेदार निर्देशिका के साथ \ WORKSPACEFOLDER \ PROJECTFOLDER \ वेब एप्लिकेशन \:

तो मेरी देव प्रणाली में उदाहरण के लिए इसे बाहर 'सी करने के लिए toString जाएगा \ WORKSPACEFOLDER \ PROJECTFOLDER \ वेब एप्लिकेशन \ फ़ाइलों

मैं इसे करने की कोशिश में 6.1 था और यह कंटेनर में कोई समस्या नहीं काम किया। आप इसे toString करने के लिए है या यह वस्तु वापस जाने के लिए कोशिश करेंगे।

mugafuga

3

ग्रेल्स, जब यह देव मोड में चलाया जाता है, तो इसकी गैंट स्क्रिप्ट्स और एप में बारीक वातावरण की संपूर्ण संपत्ति प्रदान करता है, जिसमें आधार भी शामिल है।

grails.bat पर एक नजर डालें या grails.sh स्क्रिप्ट और आप इन पंक्तियों मिलेगा:

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

जब इन लिपियों देव मोड आपको मिल में अपने परिवेश शुरू इन्हें मुफ्त में फेंक दिया गया।

जब आप युद्ध लेते हैं और तैनात करते हैं तो अब आप इन स्क्रिप्ट का उपयोग नहीं करते हैं और इसलिए आपको समस्या को हल करने की आवश्यकता है; आप या तो

  1. , अनुप्रयोग सर्वर के लिए अपने आप को स्टार्टअप स्क्रिप्ट को संपत्ति निर्दिष्ट कर सकते हैं जैसे:। -Dbase.dir =/कुछ/dir .. लेकिन
    • ... यह आम तौर पर और अधिक समझ में आता है Grails कॉन्फ़िग वस्तु जो per-environment properties
4

वहाँ एक निश्चित तरीका है ...

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

नियंत्रकों में से (उदा। Bootstrap)? बस इंजेक्ट करें ..

def grailsApplication 

सर्वश्रेष्ठ संबंध!

+0

यह वर्तमान स्वीकृत जवाब से जाने के लिए एक बेहतर तरीका है। –

2

एक अन्य विकल्प:

डीईएफ़ basePath = BuildSettingsHolder.settings.baseDir