在springboot的官方文档中对于默认静态的文件的存放位置有明确的说明。如下:
By default Spring Boot will serve static content from a directory called /static (or /public or /resources or /META-INF/resources) in the classpath or from the root of the ServletContext
翻译后的意思就是说默认情况下,Spring Boot将在类路径中或从ServletContext的根目录中提供名为/ static(或/ public或/ resources或/ META-INF / resources)的目录中的静态内容。也就是说默认情况下,可以将静态文件放到static,public,resources,/ META-INF / resources四个目录下。
四个目录的优先级:META-INF/resources > resources > static > public
在实际开发过程中,springboot是打成jar进行部署或者打成docker镜像启动容器来进行使用的。在这种情况下,如果涉及到图片上传或者系统就是一个CMS系统(内容管理系统),在图片上传时就相当于是上传到了.jar文件中去,这样效率会非常低。而且如果用户上传的图片都放到工程下面,这个工程就会变得越来越大,这样做备份的时候就会麻烦。因此,就需要将存放用户上传图片(静态文件)的路径映射到本地磁盘的路径,即需要自定义静态资源路径,而springboot也提供了这样的方法。
springboot提供了两种自定义静态资源路径的方法:
第一种为继承WebMvcConfigurerAdapter类并重写addResourceHandlers 方法:
@Configuration
public class FileConfigurerAdapter extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/**").addResourceLocations("file:D:/Users/upload/test/");
}
}
在修改完成之后,我们在D: opline中放入一个topline.html。启动服务器,通过浏览器访问ip:port/topline.html,我们可以看到如下内容:
这说明,上图中的解决方案是可行的。但是,我尝试着访问之前做优先级测试的地址,则发现出现了404错误,
这应该是Springboot默认的路径失效了,经过查看官方文档才知道,原来Springboot的默认的静态资源路径匹配的正则表达式为"/**",而我们刚刚设置的也是"/**",这样就将默认的给覆盖了。对于这样的问题,有两种解决方案。
- 第一种就是修改自定义静态资源访问路径的正则表达式:
修改之后,访问静态资源的路径也需要相应的修改
第二种就是将默认的正则表达式对应的地址加上,
上图中第一处跟第二处的效果一样,修改完成后,我们在查看页面,
接着,我们再做一次验证。我们在D盘的topline中加入一个名为test.html的文件,再次访问看看是什么情况
可以看到显示的test.html变为了D盘下的,经过多次验证得到的结论是addResourceLocations方法中前面加入的路径的优先级要高于后面路径。
- 第二种配置方法为通过配置文件,static-location的顺序影响优先级别
上面主要讲了自定义静态资源路径到磁盘路径,其实自定义到classpath下也非常的简单,只需要把file:D:/topline/换成classpath:topline,这样项目中topline就可以用来存放静态资源(不过话说话来,Springboot中已经提供了四个目录了,再加一个意义也不是很大)。
到这里这篇文章就算是结束了,文章中主要涉及到下面几点:
- Springboot提供的放置静态资源的目录有四个,他们的优先级为META-INF/resources > resources > static > public
- 可以通过继承WebMvcConfigurerAdapter类或者配置application.yml(application)来自定义静态资源路径
- 同时也可以通过WebMvcConfigurerAdapter或者配置文件来修改默认的优先级