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

22

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

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

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

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

Ваш Ответ

7   ответов
3
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());

ces»

43

вы можете получить экземплярServletContext (с помощьюServletContextAware, или с помощью автоматической проводки).

Затем вы можете получить доступ к файлам в каталоге веб-приложения напрямую getResourceAsStream(), getRealPath()) или используяServletContextResource.

EDIT от momo:

@Autowired
ServletContext servletContext;

... myMethod() { 
     File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
+ 1 дляservletContext.getRealPath("/WEB-INF/myDIR/") bizzr3
Решение, предоставленное @mahesh чуть ниже, намного лучше, потому что уровень сервиса не должен иметь зависимостей от веб-уровня. ServletContext должен выполняться только в контроллерах и тому подобное. Dani
Plus, метод getRealPath может возвращать ноль в зависимости от того, какой сервер приложений и / или приложение было развернуто, например .war в weblogic. Philippe Gioseffi
7

Я используюВесн DefaultResourceLoader а такжеРесур для чтения внутри 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());
}
DefaultResourceLoader не могу читать внутри WEB-INF, вам понадобитсяServletContextResource за эт Derp
2

если файл находится вWEB_INF\classes каталог. Который где любые файлы в вашемsrc/main/resources каталог будет скопирован с использованием обычной сборки maven ...

import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
/WEB-INF/myDir/ не является ресурсом classpath. axtavt
@ axtavt о да, предполагалось, что это был WEB-INF / classes NimChimpsky
0

если вы просто хотите получить к нему доступ из Службы (не через 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

Спасибо, но вопрос был в том, чтобы получить его под WEB-INF momomo
-1

но ... Вот несколько универсальных решений, которые я использовал для загрузки свойств из любого места веб-приложения, как это делает Spring (с поддержкой WEB-INF / ..., classpath: ..., file :. ..). Это основано на использовании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();
}

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

-1
request.getSession().getServletContext().getResourceAsStream("yourfile.pdf");

Похожие вопросы