Spring MVC Получить файл под WEB-INF без запроса
Я пытаюсь получить файл (или каталог) под /WEB-INF/.../
вне запроса. Мне нужно это в bean, загруженном при запуске сервера.
Все решения, которые я могу найти, либо хотят получить XML файл с помощью ClassPathXmlApplicationContext
, либо запрос на получение контекста сервлета или использование текущего исполняемого класса. Кажется уродливым для меня.
Как я могу получить File("/WEB-INF/myDir/")
. Должен быть способ, нет!?
Ответы
Ответ 1
Пока ваш bean объявлен в контексте веб-приложения, вы можете получить экземпляр ServletContext
(используя ServletContextAware
или путем автоустройства).
Затем вы можете напрямую обращаться к файлам в каталоге webapp (getResourceAsStream()
, getRealPath()
) или используя ServletContextResource
.
ИЗМЕНИТЬ momo:
@Autowired
ServletContext servletContext;
... myMethod() {
File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
Ответ 2
Я использую Spring DefaultResourceLoader и Resource для чтения внутри WEB-INF или любых ресурсов в файле *.jar. Работайте как шарм. Удачи!
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());
}
Ответ 3
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());
"files" должна быть дочерняя папка "main/resources"
Ответ 4
Вы можете использовать ресурс classpath, если файл находится в каталоге WEB_INF\classes
. В этом случае файлы в каталоге src/main/resources
будут скопированы с использованием обычной сборки maven...
import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
Ответ 5
Вот как вы можете это сделать, если хотите просто получить доступ к нему из службы (а не через ServletContext):
final DefaultResourceLoader loader = new DefaultResourceLoader();
Resource resource = loader.getResource("classpath:templates/mail/sample.png");
File myFile = resource.getFile();
Обратите внимание, что последняя строка может бросать IOException
, поэтому вам нужно поймать/реконструировать
Обратите внимание, что файл находится здесь:
src\main\resources\templates\mail\sample.png
Ответ 6
Не полностью связано с вашим вопросом, но...
Вот несколько универсальных sulution, которые я использовал для загрузки свойств из любого места в веб-приложении, например, Spring делает это (поддерживая WEB-INF/..., classpath:..., file:...). Is основан на использовании 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();
}
Я использовал вышеупомянутый метод в своем пользовательском прослушивателе контекста сервлетов, пока контекст еще не был загружен.