在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)的目录中的静态内容。也就是说默认情况下,可以将静态文件放到staticpublicresources/ 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,我们可以看到如下内容:

spring boot 附件下载地址 springboot文件下载路径_spring boot 附件下载地址

这说明,上图中的解决方案是可行的。但是,我尝试着访问之前做优先级测试的地址,则发现出现了404错误,

spring boot 附件下载地址 springboot文件下载路径_自定义_02

这应该是Springboot默认的路径失效了,经过查看官方文档才知道,原来Springboot的默认的静态资源路径匹配的正则表达式为"/**",而我们刚刚设置的也是"/**",这样就将默认的给覆盖了。对于这样的问题,有两种解决方案。

  • 第一种就是修改自定义静态资源访问路径的正则表达式:

 

spring boot 附件下载地址 springboot文件下载路径_自定义_03

修改之后,访问静态资源的路径也需要相应的修改

spring boot 附件下载地址 springboot文件下载路径_优先级_04

第二种就是将默认的正则表达式对应的地址加上,

spring boot 附件下载地址 springboot文件下载路径_自定义_05

上图中第一处跟第二处的效果一样,修改完成后,我们在查看页面,

spring boot 附件下载地址 springboot文件下载路径_自定义_06

接着,我们再做一次验证。我们在D盘的topline中加入一个名为test.html的文件,再次访问看看是什么情况

spring boot 附件下载地址 springboot文件下载路径_静态资源_07

可以看到显示的test.html变为了D盘下的,经过多次验证得到的结论是addResourceLocations方法中前面加入的路径的优先级要高于后面路径。

  • 第二种配置方法为通过配置文件,static-location的顺序影响优先级别

spring boot 附件下载地址 springboot文件下载路径_静态资源_08

上面主要讲了自定义静态资源路径到磁盘路径,其实自定义到classpath下也非常的简单,只需要把file:D:/topline/换成classpath:topline,这样项目中topline就可以用来存放静态资源(不过话说话来,Springboot中已经提供了四个目录了,再加一个意义也不是很大)。

到这里这篇文章就算是结束了,文章中主要涉及到下面几点:

  1. Springboot提供的放置静态资源的目录有四个,他们的优先级为META-INF/resources > resources > static > public
  2. 可以通过继承WebMvcConfigurerAdapter类或者配置application.yml(application)来自定义静态资源路径
  3. 同时也可以通过WebMvcConfigurerAdapter或者配置文件来修改默认的优先级