前言
最近在写项目的时候遇到了一个问题,当头像存储到本地后无法直接通过地址形式访问到,因为Springboot是内嵌web容器,其特点是只有一个jar文件,在容器启动后不会解压缩,然后想到了以流的形式返回给前端,但是还是想尝试一下以地址的形式访问图片。(不能直接访问就映射访问)
具体实现
写MyWebAppConfiguration并继承addResourceHandlers后重写addResourceHandlers方法,起到配置虚拟路径访问的效果
@Configuration
public class MyWebAppConfiguration extends WebMvcConfigurationSupport {
/* 文件名 ,放在jar包的同级目录下*/
@Value("${fileName}")
private String fileName;
/**
* 跨域访问配置接口
* @param registry
*/
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOriginPatterns("*")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
.allowCredentials(true)
.allowedHeaders("*")
.maxAge(3600);
}
/**
* 添加虚拟目录
* 静态资源映射
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
File path = null;
try {
path = new File(ResourceUtils.getURL("classpath:").getPath());
} catch (FileNotFoundException e) {
e.printStackTrace();
}
assert path != null;
String realPath = path.getParentFile().getParentFile().getParent() + File.separator + fileName + File.separator;
//上面gitpath其实是对文件路径做了一个拼接,File.separator根据系统自动获取路径是反斜杠还是正斜杠,path.getParentFile().getParentFile().getParent() + File.separator代表获取当前项目所在的路径
//classpath:后面的路径就是资源文件的绝对路径了,注意路径末尾也还有一个斜杠,访问路径为 ip地址+端口号+/portrait/+文件名
registry.addResourceHandler("/portrait/**").addResourceLocations(realPath);
log.info("拼接后的实际路径为={}",realPath);
super.addResourceHandlers(registry);
}
}