Подтвердить что ты не робот

Spring MVC Получить файл под WEB-INF без запроса

Я пытаюсь получить файл (или каталог) под /WEB-INF/.../

вне запроса. Мне нужно это в bean, загруженном при запуске сервера.

Все решения, которые я могу найти, либо хотят получить XML файл с помощью ClassPathXmlApplicationContext, либо запрос на получение контекста сервлета или использование текущего исполняемого класса. Кажется уродливым для меня.

Как я могу получить File("/WEB-INF/myDir/"). Должен быть способ, нет!?

4b9b3361

Ответ 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();
}

Я использовал вышеупомянутый метод в своем пользовательском прослушивателе контекста сервлетов, пока контекст еще не был загружен.