26

我正在尝试获取下的文件(或目录)/WEB-INF/.../

在请求之外。我需要它在服务器启动时加载的 bean 中。

我能找到的所有解决方案要么需要使用 XML 文件,ClassPathXmlApplicationContext要么需要获取 servlet 上下文或使用当前执行类的请求。在我看来很难看。

我怎样才能得到一个File("/WEB-INF/myDir/"). 总得有办法吧!?

4

7 回答 7

48

只要您的 bean 在 Web 应用程序上下文中声明,您就可以获得ServletContext(使用ServletContextAware,或通过自动装配)的实例。

然后您可以直接访问 webapp 目录中的文件(getResourceAsStream(), getRealPath()),或使用ServletContextResource.

莫莫编辑:

@Autowired
ServletContext servletContext;

... myMethod() { 
     File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
于 2012-06-26T15:29:42.400 回答
10

我使用Spring DefaultResourceLoaderResource来读取 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());
}
于 2014-03-07T13:54:16.623 回答
3
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());

“files”文件夹应该是“main/resources”文件夹的子文件夹

于 2015-06-29T05:26:37.913 回答
2

如果文件位于WEB_INF\classes目录中,则可以使用类路径资源。src/main/resources使用普通的 Maven 构建将目录中的任何文件复制到其中...

import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
于 2012-06-26T15:20:46.030 回答
0

如果您只想从服务(而不是通过 ServletContext)访问它,您可以这样做:

    final DefaultResourceLoader loader = new DefaultResourceLoader();
    Resource resource = loader.getResource("classpath:templates/mail/sample.png");
    File myFile = resource.getFile();

请注意,最后一行可能会抛出IOException,因此您需要 catch / rethrow

请注意,该文件在这里: src\main\resources\templates\mail\sample.png

于 2015-09-07T20:04:54.873 回答
-1
request.getSession().getServletContext().getResourceAsStream("yourfile.pdf");
于 2018-11-05T19:57:21.883 回答
-1

与您的问题不完全相关,但是...这是我用来从Web应用程序中的任何位置加载属性的一些通用解决方案,例如Spring(支持WEB-INF / ...,类路径:...,文件:.. .)。是基于使用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();
}

我在我的自定义 servlet 上下文侦听器中使用了上述方法,而 conext 尚未加载。

于 2016-11-10T12:00:17.037 回答