2016-04-28 12 views
6

मेरा प्ले ऐप 2.4.2 में है। डेवलपर मोड में, मैं Source.fromFile ("./ public/files/abc.json")उत्पादन में प्ले फ्रेमवर्क में सार्वजनिक फ़ोल्डर से फ़ाइलें पढ़ना

का उपयोग करते हुए बैक-एंड नियंत्रकों पर सार्वजनिक फ़ोल्डर से फ़ाइलों को पढ़ता था, जब मैंने एप्लिकेशन को उत्पादन मोड में परिवर्तित किया, तो मैं हूं फाइल नहीं मिली अपवाद। मैंने पाया कि सार्वजनिक फ़ोल्डर को उत्पादन मोड में एक संपत्ति जार में पैक किया गया है। मैं क्या कर सकता हूं ताकि यह विकास और उत्पादन मोड दोनों में काम करे ??

Play.application().getFile("/public/foobar.baz"); 

Method Doc:

+1

आप classpath से इसे पढ़ने की कोशिश कर सकते: http://stackoverflow.com/a/1464366/1080523 – rethab

+0

@ user1869107 "उत्पादन मोड, प्ले के दशक में क्लास लोडर केवल conf फ़ोल्डर से फ़ाइलें पढ़ सकता है "-> यह सही नहीं है। असल में आप वितरण में प्ले फ्रेमवर्क में अन्य संसाधन निर्देशिका जोड़ सकते हैं। मैं अपना जवाब संपादित करूंगा और कैसे जोड़ूंगा। –

उत्तर

4

क्या आपने इस प्ले डॉक्यूमेंटेशन https://www.playframework.com/documentation/2.5.x/AssetsOverview को आजमाया है? यह 2.4 के साथ ठीक है और यहां तक ​​कि 2.3 के साथ भी, मैंने कोशिश की है।

वहां आप इसे पा सकते हैं, आप बस इसे अपने conf/path फ़ाइल में कर सकते हैं।

GET /assets/*file  controllers.Assets.at(path="/public", file) 

फ़ाइल -> फ़ाइल नाम को संदर्भित करता है। पूर्व: myFile.json

इस काम को उत्पादन मोड में बनाने के लिए आपको कुछ और काम करना है। जैसा कि this उत्तर में बताया गया है, इन पंक्तियों को अपनी /build.sbt फ़ाइल में जोड़ें।

import com.typesafe.sbt.packager.MappingsHelper._ 
    mappings in Universal ++= directory(baseDirectory.value/"public") 

इसमें आपकी फ़ाइल के अंदर 'सार्वजनिक' निर्देशिका शामिल होगी (आप इस तरह की कोई निर्देशिका शामिल कर सकते हैं)। फिर आपका आवेदन उत्पादन वातावरण में काम करेगा।

+1

पर इंगित करता है यहां दिए गए एसबीटी निर्देश भी Play 2.3 के लिए काम करते हैं! – EdgeCaseBerg

1

आप इस विधि का उपयोग कर सकते हैं

आवेदन रूट पथ के लिए एक फ़ाइल सापेक्ष प्राप्त करें।

+0

यह सहायक था क्योंकि यह मुझे 'resourceAsStream' विधि – EdgeCaseBerg

0

Play सार्वजनिक संपत्तियों की सेवा के लिए अंतर्निहित नियंत्रक के साथ आता है।

नियंत्रक controllers.Assets के रूप में डिफ़ॉल्ट प्ले जार में उपलब्ध है और दो मापदंडों के साथ कार्रवाई में एक ही परिभाषित करता है:

Assets.at (पथ: स्ट्रिंग, फ़ाइल: स्ट्रिंग) पथ पैरामीटर तय की जानी चाहिए और कार्रवाई द्वारा प्रबंधित निर्देशिका को परिभाषित करता है। फ़ाइल पैरामीटर आमतौर पर अनुरोध पथ से गतिशील रूप से निकाला जाता है।

GET /assets/*file  controllers.Assets.at(path="/public", file) 

Refer here for more.

0

इस को हल करने के दो तरीके हैं:

यहाँ अपने conf/मार्गों फ़ाइल में शामिल एसेट नियंत्रक की विशिष्ट मानचित्रण है - 1) सीधे एक क्या उपयोग करने के लिए है उपन विजराथने ने उपरोक्त टिप्पणी में सुझाव दिया। 2) दूसरा, निम्न दृष्टिकोण का उपयोग करना है, यदि कोई एप्लिकेशन के वितरण संस्करण में कोई अतिरिक्त सार्वजनिक फ़ोल्डर नहीं जोड़ना चाहता है: - ए) सभी फ़ाइलों को conf फ़ोल्डर में सार्वजनिक फ़ोल्डर से कॉपी करें। बी) Play के क्लासलोडर का उपयोग कर संसाधन के रूप में संसाधन प्राप्त करें। सी) इस इनपुटस्ट्रीम को Source.fromInputStream विधि का उपयोग करके bufferedsource में कनवर्ट करें। अब, इस फ़ाइल को प्रसंस्करण के लिए नियंत्रक द्वारा उपयोग किया जा सकता है।

0

मिले समाधान: संपत्ति का उपयोग उन संसाधनों कॉल करने के लिए की जरूरत है/

संबंधित मुद्दे