阿里云部署SpringBoot项目访问本地静态资源(例如获取头像)

191 阅读1分钟

前言

最近在写项目的时候遇到了一个问题,当头像存储到本地后无法直接通过地址形式访问到,因为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);

    }
}