我正在尝试获取下的文件(或目录)/WEB-INF/.../
在请求之外。我需要它在服务器启动时加载的 bean 中。
我能找到的所有解决方案要么需要使用 XML 文件,ClassPathXmlApplicationContext
要么需要获取 servlet 上下文或使用当前执行类的请求。在我看来很难看。
我怎样才能得到一个File("/WEB-INF/myDir/")
. 总得有办法吧!?
我正在尝试获取下的文件(或目录)/WEB-INF/.../
在请求之外。我需要它在服务器启动时加载的 bean 中。
我能找到的所有解决方案要么需要使用 XML 文件,ClassPathXmlApplicationContext
要么需要获取 servlet 上下文或使用当前执行类的请求。在我看来很难看。
我怎样才能得到一个File("/WEB-INF/myDir/")
. 总得有办法吧!?
只要您的 bean 在 Web 应用程序上下文中声明,您就可以获得ServletContext
(使用ServletContextAware
,或通过自动装配)的实例。
然后您可以直接访问 webapp 目录中的文件(getResourceAsStream()
, getRealPath()
),或使用ServletContextResource
.
莫莫编辑:
@Autowired
ServletContext servletContext;
... myMethod() {
File rootDir = new File( servletContext.getRealPath("/WEB-INF/myDIR/") );
}
我使用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());
}
ClassLoader classLoader = getClass().getClassLoader();
File file = new File(classLoader.getResource("files/test.xml").getFile());
“files”文件夹应该是“main/resources”文件夹的子文件夹
如果文件位于WEB_INF\classes
目录中,则可以使用类路径资源。src/main/resources
使用普通的 Maven 构建将目录中的任何文件复制到其中...
import org.springframework.core.io.Resource
...
final Resource yourfile = new ClassPathResource( "myfile.txt");
如果您只想从服务(而不是通过 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
request.getSession().getServletContext().getResourceAsStream("yourfile.pdf");
与您的问题不完全相关,但是...这是我用来从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 尚未加载。