Spring MVC在没有请求的情况下获取WEB-INF下的文件

时间:2012-06-26 15:13:45

标签: spring spring-mvc

我想抓住/WEB-INF/.../

下的文件(或目录)

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

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

如何获得File("/WEB-INF/myDir/")。必须有一种方法,不!!

7 个答案:

答案 0 :(得分:43)

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

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

编辑momo:

@Autowired
ServletContext servletContext;

... myMethod() { 
     File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}

答案 1 :(得分:7)

我使用 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());
}

答案 2 :(得分:3)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="time"></div>

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

答案 3 :(得分:2)

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

import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");

答案 4 :(得分: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

答案 5 :(得分:-1)

与您的问题不完全相关,但...... 这里有一些通用的例子,我用来从Web应用程序中的任何地方加载属性,比如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();
}

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

答案 6 :(得分:-1)

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