一卓的博客

怕什么真理无穷,
进一寸有一寸的欢喜。

0%

SpringBoot 通过 url 访问获取内部或者外部磁盘静态资源

在 Web 开发中,静态资源的访问是必不可少的,如:图片、JS、CSS 等资源的访问。
Spring Boot 对静态资源访问提供了很好的支持,基本使用默认配置就能满足开发需求。

默认静态资源映射

Spring Boot 默认将 /** 所有访问映射到静态资源目录。

  • Spring Boot 提供默认静态资源目录位置需置于 classpath 下,目录名需符合如下规则:
1
2
3
4
/static
/public
/resources
/META-INF/resources

举例:我们可以在 src/main/resources/ 目录下创建目录 static,在该位置创建一个 demo.txt 文件,内容为 Hello world 。启动程序后,尝试访问 http://localhost:8080/demo.txt 。如能显示 Hello world,则配置成功。

  • 目录优先级

如果多个资源目录同时存在,则会按照以下优先级获取资源:

/META-INF/resources > resources > static > public

可看源码 org.springframework.boot.autoconfigure.web.ResourcePropertiesCLASSPATH_RESOURCE_LOCATIONS属性如下:

resource

自定义静态资源目录

静态资源在项目下的自定义目录

在 application.yml/application.properties 文件中配置

1
spring.resources.static-locations=自定义的路径

如果配置了自定义目录,则默认的静态目录仅 META-INF/resources 目录下的资源文件仍可访问,

其他目录失效。建议使用自定义目录时添加系统默认路径如下:

1
2
3
4
5
6
# 自定义静态文件目录
customize.static-locations=classpath:/github
# 自定义静态资源目录 越靠前的配置优先级越高
spring.resources.static-locations=${customize.static-locations},\
classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,\
classpath:/public/

访问本地磁盘的静态资源

诸如文件上传,头像上传等场景,一般是将文件单独存放在磁盘上,此时可将磁盘目录映射到一个目录,和项目下的自定义目录类似,仅需加上 file: 前缀,如下:

1
2
# 自定义静态资源目录
spring.resources.static-locations=file:D:/data/management/uploadPath

举例:在 D 盘新建目录 /data/management/uploadPath ,在目录下新建 demo.txt,内容为 this is demo. 启动程序后,尝试访问 http://localhost:8080/demo.txt ,如能显示文件内容,则配置成功。

如果需要更高级的定制,例如将磁盘目录映射到一个定制路径,例如 http://localhost:8080/profile/ ,则需要实现 WebMvcConfigurer

1
2
3
4
5
6
7
8
9
10
11
/***
* 自定义静态资源访问
*/
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {

public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/profile/**")
.addResourceLocations("file:D:/data/management/uploadPath/");
}
}

在 D:/data/management/uploadPath/ 下新建 /avatar/demo.txt,内容为 this is profile demo. 启动程序后,尝试访问 http://localhost:8080/profile/avatar/demo.txt ,如能显示文件内容,则配置成功。

代码示例

本文的相关例子可以查看下面仓库中的spring-boot-samples-resources目录:

如果您觉得本文不错,欢迎 Star 支持,您的关注是我坚持的动力!

请作者喝杯咖啡吧