6
votes

I have webproject which has images inside src/main/webapp folder. I would like to place images in different folder on the disk. But I have no idea how to manage requests to reach this images. Should I create some kind of httpServlet like shown here: http://balusc.omnifaces.org/2007/07/fileservlet.html

Or as I use Spring MVC with java configuration, there is more suitable and simpler way.

Looking forward for your suggestions.

3

3 Answers

10
votes

Use the spring mvc support for static resources, its location attribute is an Spring Resource, so you could use file: prefix

<resources mapping="/resources/**" location="file:/my/external/directory/" />

or

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("file:/my/external/directory/");
    }
}

@See Spring Reference Chapter 6.4 The ResourceLoader for a table that list all prefixed for resources

5
votes

In my case I placed js and css resources in webapp and images in e://images/. For this case I use two mvc:resources mapping

<mvc:resources mapping="/resources/**" location="/resources/"/>
<mvc:resources mapping="/images/**" location="file:e://images/"/>

And locate the image of e: > images > abc.jpg using ....

<img src="../images/abc.jpg"/>

You could try also <img src="/images/abc.jpg"/> or <img src="images/abc.jpg"> (If not work)

The css/js linked under webapp > resources > js > xyz.js like below.

<script type='text/javascript' src='../resources/js/xyz.js'></script>
0
votes

You can implement WebMvcConfigurer in your main Application or Main class..

It's working for me

@SpringBootApplication
@ComponentScan("com.your.package.controller")
@Configuration
public class ServicesApplication implements WebMvcConfigurer {   // ServicesApplication is my main class

    String your_drive_location = "file:///D:/upload_dir/upload/"; // my file path  

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/images/**").addResourceLocations(your_drive_location );
    }

    public static void main(String[] args) {
        SpringApplication.run(ServicesApplication.class, args);
    }

}

I am using JSTL for showing ..

<c:forEach items="${ListOfBrand}" var="brand">  // ListOfBrand is a Map
    <img src=" <c:out value="/images/"/>${brand.brand_image}" />  // Showing all image from brand table
</c:forEach>