2012-06-26 11 views
20

próbuję zdobyć pliku (lub katalogu) pod /WEB-INF/.../Wiosna MVC Pobierz plik pod WEB-INF bez wniosku

zewnątrz wniosku. Potrzebuję go w komponencie bean załadowanym podczas uruchamiania serwera.

Wszystkie znalezione przeze mnie rozwiązania wymagają pliku XML przy użyciu ClassPathXmlApplicationContext lub żądania uzyskania kontekstu serwletu lub użycia bieżącej klasy wykonawczej. Wydaje mi się brzydki.

Jak uzyskać File("/WEB-INF/myDir/"). Musi być jakiś sposób, nie !?

Odpowiedz

35

Dopóki fasola jest zadeklarowana w kontekście aplikacji internetowych można uzyskać instancję ServletContext (używając ServletContextAware, lub przez autowiring).

Następnie można uzyskać dostęp do plików w katalogu webapp bezpośrednio (getResourceAsStream(), getRealPath()), lub przy użyciu ServletContextResource.

EDIT przez momo:

@Autowired 
ServletContext servletContext; 

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

+1 dla 'servletContext.getRealPath ("/WEB-INF/myDIR/")' – bizzr3

+0

Rozwiązanie dodane przez @mahesh tuż poniżej jest znacznie lepsze, ponieważ usługa Warstwa nie powinna mieć zależności od Warstwy WWW.ServletContext powinno być wykonywane tylko w kontrolerach i tym podobnych. – Dani

+0

Plus, metoda getRealPath może zwrócić wartość null, w zależności od tego, który serwer aplikacji i/lub aplikacja została wdrożona, na przykład .war w weblogic. –

2

Możesz użyć zasobu classpath, jeśli plik znajduje się w katalogu WEB_INF\classes. Czyli tam, gdzie wszystkie pliki w katalogu src/main/resources zostaną skopiowane do korzystania z normalnej kompilacji maven ...

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

'/ WEB-INF/myDir /' nie jest zasobem klasy classpath. – axtavt

+0

@ aktavt oh tak, założono, że to WEB-INF/classes – NimChimpsky

7

używam WiosnaDefaultResourceLoader i zasobów czytać wewnątrz WEB-INF lub jakichkolwiek zasobów w * .jar. Działaj jak czar. Powodzenia!

"Pliki"
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' nie może odczytać wewnątrz WEB-INF, będziesz potrzebować' ServletContextResource' dla tego – Derp

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

folder powinien być dzieckiem "main/zasobów" Folder

1

ten sposób można to zrobić, jeśli po prostu chcesz uzyskać do niego dostęp z Service (nie przez ServletContext) :

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

Zauważ, że ostatnia linia może rzucać IOException więc trzeba złapać/rethrow

Uwaga, że ​​plik znajduje się tutaj: src\main\resources\templates\mail\sample.png

+1

Dzięki, ale pytanie dotyczyło uzyskania go pod WEB-INF – momomo

0

Nie całkowicie związany z pytaniem, ale ... Oto uniwersalna sulution użyłem załadować właściwości z dowolnego miejsca w aplikacji internetowej jak wiosna to robi (wspieranie WEB- INF/..., classpath: ..., file: ...). Jest oparty na użyciu ServletContextResourcePatternResolver. Będziesz potrzebował 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(); 
} 

Użyłem powyższej metody w moim niestandardowym detektorze kontekstowym serwletu, podczas gdy conext nie został jeszcze załadowany.