Spring MVC Pobierz plik pod WEB-INF bez żądania
Próbuję zdobyć plik (lub katalog) pod /WEB-INF/.../
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!?
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/") );
}
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());
}
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"
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");
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
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.
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