Serving Static resources from file system | Spring Boot Web

前端 未结 4 635
忘了有多久
忘了有多久 2020-12-14 01:58

Using a Spring Boot web application I trying to serve my static resource from a file system folder outside my project.

Folder structure looks like:-

         


        
4条回答
  •  悲哀的现实
    2020-12-14 02:50

    All solutions provided with Spring Boot 2 didn't work in our case, not with the WebMvcConfigurerAdapter nor with the WebMvcConfigurer. Using the @EnableWebMvc annotation made it even worse as the regular contents that worked before stopped working also due to the fact that the WebMvcAutoConfiguration was getting ignored at that point I suppose.

    One possible solution is to define the spring.resources.static-locations property, but this implies that the static location is hard coded. We wanted to add a static location at runtime so it is independent of the environment we're deploying to as the external directoy containing the resource was located at the same place as where the application is deployed. To achieve this I came up with the following solution:

    @Configuration
    @SpringBootApplication
    public class MainConfiguration {
        @Inject
        public void appendExternalReportingLocation(ResourceProperties resourceProperties) {
            String location = "file://" + new File("ext-resources").getAbsolutePath();
            List staticLocations = newArrayList(resourceProperties.getStaticLocations());
            staticLocations.add(location);
            resourceProperties.setStaticLocations(staticLocations.toArray(new String[staticLocations.size()]));
        }
    }
    

    UPDATE: Unfortunately the above solution only worked when launching the Spring Boot application from within the IDE (e.g. IntelliJ). So I came up with another solution to serve static content from the file system.

    First I created a Filter as follow:

    public class StaticContentFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            File file = new File(new File("ext-resources").getAbsolutePath(), ((HttpServletRequest)request).getServletPath());
            if (file.exists() && !file.isDirectory()) {
                org.apache.commons.io.IOUtils.copy(new FileInputStream(file), response.getOutputStream());
            }
            else {
                chain.doFilter(request, response);
            }
        }
    }
    

    Then I registerd with Spring Boot as follow:

    @Configuration
    @SpringBootApplication
    public class MainConfiguration {
        @Bean
        public FilterRegistrationBean staticContentFilter() {
            return new FilterRegistrationBean(new StaticContentFilter());
        }
    }
    

提交回复
热议问题