Spring MVC Pobierz plik pod WEB-INF bez żądania

Próbuję zdobyć plik (lub katalog) pod /WEB-INF/.../

Poza żądaniem. Potrzebuję go w Beanie załadowanym przy starcie serwera.

Wszystkie rozwiązania, które mogę znaleźć, chcą pliku XML używając ClassPathXmlApplicationContext lub żądania, aby uzyskać kontekst servleta lub używając bieżącej klasy wykonującej. Wydaje mi się brzydki.

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

Author: D0dger, 2012-06-26

6 answers

Dopóki Bean jest zadeklarowany w kontekście aplikacji webowej, można uzyskać instancję ServletContext (używając ServletContextAware lub przez autowiringowanie).

Następnie możesz uzyskać dostęp do plików w katalogu webapp bezpośrednio (getResourceAsStream(), getRealPath()), lub za pomocą ServletContextResource.

EDIT by momo:

@Autowired
ServletContext servletContext;

... myMethod() { 
     File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
 40
Author: axtavt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-21 09:54:19

Używam Wiosna DefaultResourceLoader i Resource do odczytu wewnątrz WEB-INF lub dowolnych zasobów w *.plik jar. Pracuj jak czar. Powodzenia!

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());
}
 8
Author: mahesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 14:30:11
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());

Folder "files" powinien być potomkiem folderu "main / resources"

 4
Author: Murali Krish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 14:28:52

Możesz użyć zasobu classpath, jeśli plik znajduje się w katalogu WEB_INF\classes. W tym miejscu wszelkie pliki w katalogu src/main/resources zostaną skopiowane do normalnej kompilacji Mavena ...

import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
 2
Author: NimChimpsky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-26 15:39:02

Tak możesz to zrobić, jeśli chcesz uzyskać do niego dostęp z usługi (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 rzucić IOException więc musisz złapać / rethrow

Zauważ, że plik jest tutaj: src\main\resources\templates\mail\sample.png

 1
Author: ACV,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-07 20:04:54

Nie do końca związane z twoim pytaniem, ale... Oto jakaś uniwersalna sulucja, której użyłem do załadowania właściwości z dowolnego miejsca w aplikacji webowej, jak robi to Spring (obsługa WEB-INF/..., classpath:..., plik:...). 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 custom Servlet context listener podczas gdy conext nie był jeszcze wczytany.

 0
Author: Derp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-10 12:00:17