2012-06-26 16 views
20

मैं तहत /WEB-INF/.../वसंत MVC एक अनुरोध

एक अनुरोध के बाहर एक फ़ाइल (या एक निर्देशिका) की पकड़ पाने के लिए कोशिश कर रहा हूँ बिना वेब-INF तहत फ़ाइल प्राप्त करें। मुझे सर्वर स्टार्टअप पर लोड किए गए बीन में इसकी आवश्यकता है।

सभी समाधान जो मुझे मिल सकता है या तो ClassPathXmlApplicationContext या सर्वलेट संदर्भ प्राप्त करने या वर्तमान निष्पादन वर्ग का उपयोग करने के लिए एक XML फ़ाइल चाहता है। मेरे लिए बदसूरत लगता है।

मैं File("/WEB-INF/myDir/") कैसे प्राप्त कर सकता हूं। एक रास्ता होना है, नहीं !?

उत्तर

35

जब तक आपके सेम वेब अनुप्रयोग संदर्भ आप ServletContext का एक उदाहरण प्राप्त कर सकते हैं में घोषित किया जाता है (ServletContextAware का उपयोग कर, या autowiring द्वारा)।

फिर आप वेबपैप निर्देशिका में फ़ाइलों को सीधे एक्सेस कर सकते हैं (getResourceAsStream(), getRealPath()), या ServletContextResource का उपयोग कर।

संपादित करें मोमो द्वारा:

@Autowired 
ServletContext servletContext; 

... myMethod() { 
    File rootDir = new File(servletContext.getRealPath("/WEB-INF/myDIR/")); 
} 
+1

+1 था, नीचे दिए गए समाधान @mhesh द्वारा दिए गए समाधान बहुत बेहतर हैं, क्योंकि सेवा परत को वेब परत से निर्भरता नहीं होनी चाहिए।ServletContext केवल नियंत्रकों और कुछ ऐसा करने में किया जाना चाहिए। – bizzr3

+0

'के लिए WEB-INF/कक्षा – Dani

+0

प्लस, getRealPath विधि वेब अनुप्रयोग में .war जैसे एप्लिकेशन एप्लिकेशन और/या एप्लिकेशन को तैनात किया गया है, इस पर निर्भर करता है। –

2

यदि फ़ाइल WEB_INF\classes निर्देशिका में स्थित है तो आप क्लासपाथ संसाधन का उपयोग कर सकते हैं। कौन सा है, जहां आपके src/main/resources निर्देशिका में किसी भी फाइल एक सामान्य Maven निर्माण का उपयोग कर में कॉपी किया जायेगा है ...

import org.springframework.core.io.Resource 
... 
final Resource yourfile = new ClassPathResource("myfile.txt"); 
+4

'/ WEB-INF/myDir /' क्लासपाथ संसाधन नहीं है। – axtavt

+0

@axtavt ओह हाँ, माना जाता है कि यह 'servletContext.getRealPath ("/ WEB-INF/myDIR /")' – NimChimpsky

7

मैं उपयोग स्प्रिंगDefaultResourceLoader और संसाधन एक * .jar फ़ाइल में वेब-INF या किसी संसाधन के अंदर पढ़ने के लिए। एक आकर्षण की तरह काम करते हैं। सौभाग्य!

import org.springframework.core.io.DefaultResourceLoader; 
import org.springframework.core.io.Resource; 

public static void myFunction() throws IOException { 
    final DefaultResourceLoader loader = new DefaultResourceLoader();    
    LOGGER.info(loader.getResource("classpath:META-INF/resources/img/copyright.png").exists());    
    Resource resource = loader.getResource("classpath:META-INF/resources/img/copyright.png");   
    BufferedImage watermarkImage = ImageIO.read(resource.getFile()); 
} 
+0

'DefaultResourceLoader' WEB-INF के अंदर नहीं पढ़ा जा सकता है, आपको – Derp

4
ClassLoader classLoader = getClass().getClassLoader(); 
File file = new File(classLoader.getResource("files/test.xml").getFile()); 

"फ़ाइलें" फ़ोल्डर "मुख्य/संसाधनों" फ़ोल्डर के बच्चे होना चाहिए

1

इस तरह आप यह कर सकते हैं आप सिर्फ एक सेवा (नहीं ServletContext के माध्यम से) से उस तक पहुंच चाहते हैं :

final DefaultResourceLoader loader = new DefaultResourceLoader(); 
    Resource resource = loader.getResource("classpath:templates/mail/sample.png"); 
    File myFile = resource.getFile(); 

नोट अंतिम पंक्ति फेंक सकता है कि IOException ताकि आप को पकड़ने के लिए की जरूरत है/rethrow

ध्यान दें, उस फ़ाइल यहाँ है: src\main\resources\templates\mail\sample.png

+1

धन्यवाद के लिए 'ServletContextResource' की आवश्यकता होगी, लेकिन सवाल यह है कि इसे वेब-आईएनएफ के तहत प्राप्त करने के बारे में था – momomo

0

पूरी तरह से अपने प्रश्न से संबंधित नहीं है, लेकिन ... यहाँ कुछ सार्वभौमिक sulution मैं वेब अनुप्रयोग में कहीं से भी गुण लोड करने के लिए स्प्रिंग यह होता है की तरह इस्तेमाल किया (समर्थन WEB- है आईएनएफ/..., कक्षापथ: ..., फ़ाइल: ...)। ServletContextResourcePatternResolver का उपयोग करने पर आधारित है। आपको ServletContext की आवश्यकता होगी।

private static Properties loadPropsTheSpringWay(ServletContext ctx, String propsPath) throws IOException { 
    PropertiesFactoryBean springProps = new PropertiesFactoryBean(); 
    ResourcePatternResolver resolver = new ServletContextResourcePatternResolver(ctx); 
    springProps.setLocation(resolver.getResource(propsPath)); 
    springProps.afterPropertiesSet(); 
    return springProps.getObject(); 
} 

मैंने उपरोक्त विधि का उपयोग मेरे कस्टम सर्वलेट संदर्भ श्रोता में किया था जबकि कन्वर्क्स्ट अभी तक लोड नहीं हुआ था।

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