案例说明:
服务器上的路径为home/zkqy/uploadPath/upload/2025/06/12/yileina_20250612182156A002.jpg
网页url https://xxx.com/profile/upload/2025/06/12/yileina_20250612182156A002.jpg
只要直接访问网页的url就可以得到图片了,也没有代理啥的,是不是很神奇。
上面的路径和url可以化简成这样。
服务器的路径为:文件初始路径 + 文件上传附加路径
网页的路径为:服务器的域名 + profile + 文件上传附加路径
源码分析
核心的配置文件是在 ResourcesConfig.java,核心代码如下
java
@Configuration
public class ResourcesConfig implements WebMvcConfigurer
{
@Autowired
private RepeatSubmitInterceptor repeatSubmitInterceptor;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
/** 本地文件上传路径 */
registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
.addResourceLocations("file:" + RuoYiConfig.getProfile() + "/");
}
}
可以发现这个类实现了WebMvcConfigurer接口里面的addResourceHandlers这个资源拦截器。
1. addResourceHandler:定义 URL 访问路径
-
Constants.RESOURCE_PREFIX + "/**"
这是一个字符串,表示匹配的 URL 路径模式。例如:
- 若
RESOURCE_PREFIX = "/profile"
,则匹配所有以/profile/
开头的请求(如/profile/upload/xxx.txt
)。
- 若
-
/**
是通配符,表示匹配该路径下的所有子路径。
2. addResourceLocations:指定物理存储路径
-
"file:" + RuoYiConfig.getProfile() + "/"
这里将 URL 路径映射到服务器的本地文件系统:
file:
表示这是一个本地文件系统路径(区别于 classpath 资源)。RuoYiConfig.getProfile()
是若依框架中获取文件存储根目录的方法(如返回D:/zkqy/uploadPath
)。- 最终拼接为物理路径,例如:
file:D:/zkqy/uploadPath/
。