복붙노트

[SPRING] Spring MVC 요청없이 WEB-INF하에 파일 가져 오기

SPRING

Spring MVC 요청없이 WEB-INF하에 파일 가져 오기

/WEB-INF/.../에서 파일 (또는 디렉토리)을 확보하려고합니다.

요청을 벗어났습니다. 서버를 시작할 때로드 된 bean에서 필요합니다.

내가 찾을 수있는 모든 솔루션은 ClassPathXmlApplicationContext를 사용하는 XML 파일이나 서블릿 컨텍스트를 얻거나 현재 실행중인 클래스를 사용하기위한 요청을 원합니다. 못생긴 것 같아.

어떻게 파일 ( "/ WEB-INF / myDir /")을 얻을 수 있습니까? 방법이 있어야합니다, 안돼!?

해결법

  1. ==============================

    1.빈이 웹 애플리케이션 컨텍스트에서 선언되는 한 ServletContext의 인스턴스를 얻을 수있다 (ServletContextAware를 사용하거나 자동 와이어 링으로).

    빈이 웹 애플리케이션 컨텍스트에서 선언되는 한 ServletContext의 인스턴스를 얻을 수있다 (ServletContextAware를 사용하거나 자동 와이어 링으로).

    그런 다음 webapp 디렉토리의 파일에 직접 액세스 (getResourceAsStream (), getRealPath ())하거나 ServletContextResource를 사용하여 액세스 할 수 있습니다.

    모모 편집 :

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

    2.Spring DefaultResourceLoader와 Resource를 사용하여 WEB-INF 또는 * .jar 파일의 모든 리소스를 읽습니다. 매력처럼 작동하십시오. 행운을 빕니다!

    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. ==============================

    3.

    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("files/test.xml").getFile());
    

    "files"폴더는 "main / resources"폴더의 하위 폴더 여야합니다.

  4. ==============================

    4.파일이 WEB_INF \ classes 디렉토리에 있으면 클래스 경로 자원을 사용할 수 있습니다. src / main / resources 디렉토리에있는 파일들이 일반적인 maven 빌드를 사용하여 복사되는 곳은 ...

    파일이 WEB_INF \ classes 디렉토리에 있으면 클래스 경로 자원을 사용할 수 있습니다. src / main / resources 디렉토리에있는 파일들이 일반적인 maven 빌드를 사용하여 복사되는 곳은 ...

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

    5.ServletContext가 아닌 Service에서 액세스하려는 경우 다음과 같이 할 수 있습니다.

    ServletContext가 아닌 Service에서 액세스하려는 경우 다음과 같이 할 수 있습니다.

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

    마지막 행은 IOException을 throw하여 catch / rethrow 할 필요가 있습니다.

    파일의 위치는 다음과 같습니다. src \ main \ resources \ templates \ mail \ sample.png

  6. ==============================

    6.완전히 당신의 질문과 관련이 없지만 ... Spring과 같은 웹 애플리케이션의 어느 곳에서나 속성을로드하는 데 사용되는 보편적 인 해결책이있다 (WEB-INF / ..., classpath : ..., file : ... 지원). Is는 ServletContextResourcePatternResolver를 사용하는 것을 기반으로합니다. ServletContext가 필요합니다.

    완전히 당신의 질문과 관련이 없지만 ... 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();
    }
    

    conext가 아직로드되지 않은 동안 위의 메소드를 내 사용자 정의 서블릿 컨텍스트 리스너에서 사용했습니다.

  7. ==============================

    7.

    request.getSession().getServletContext().getResourceAsStream("yourfile.pdf");
    
  8. from https://stackoverflow.com/questions/11210465/spring-mvc-get-file-under-web-inf-without-a-request by cc-by-sa and MIT license