SpringBoot设置文件虚拟路径映射

前言

我们在写SpringBoot项目的时候,很大几率会遇到文件上传与下载功能。
我们一般访问服务器的资源都是resources下的公开资源,配置文件中一般会指定到类路径下的static文件夹下:spring.resources.static-locations=classpath:/static/,或者说不配置默认指定在类路径下:classpath:/,例如:

# 应用服务 WEB 访问端口
server.port=8080
# 项目资源路径:必须加static作为前缀才能访问 默认为/**
spring.mvc.static-path-pattern=/static/**
# 将项目资源路径映射到系统资源路径下
spring.resources.static-locations=classpath:/ #效果等同于不配置

但是我们可能会把一些项目的文件放在其他服务器或者硬盘中,这样可以更好的存储和管理系统的文件,那么我们应该如何通过项目的路径来访问这些文件呢?

只需要我们给SpringBoot中配置一个虚拟路径,将硬盘的路径映射到项目路径下,这样就可以通过项目路径来访问硬盘中的资源了。


本文将讲解2种方法

  1. 配置application.properties/yml
  2. 自定义配置类实现WebMvcConfigurer接口

准备系统资源路径

为了演示效果,我会在本地系统路径中存放一张图片:

系统路径:H:\AFile\baidu.pngSpringBoot设置文件虚拟路径映射_第1张图片
我们来访问一下系统资源下的一张百度图片,访问的时候需要加上前缀file:然后加上绝对路径H:\AFile\baidu.png就可以访问到百度这张图片,浏览器会在file:后面加上///,你只需要以前缀file:加上绝对路径即可无需写成file:,交给浏览器来做。
SpringBoot设置文件虚拟路径映射_第2张图片

配置SpringBoot虚拟路径的映射

定义application文件

# 应用服务 WEB 访问端口
server.port=8080
# 项目静态资源路径,可以不写默认为/**
# spring.mvc.static-path-pattern=/**
# 将项静态目资源路径映射到系统资源路径下
spring.resources.static-locations=file:H:\\AFile

项目资源路径不写默认为/**,意味着你在localhost:8080/下能直接访问静态资源,而静态资源映射在系统资源H:\AFile\文件夹下,你所访问项目静态资源路径都和系统本地资源路径一一对应。

Tips:

spring.resources.static-locations可以指定多个资源路径,用隔开

spring.resources.static-locations=file:G:\\AFile,file:H:\\AFile

如果访问多个路径中存在相同名称的资源,会采取就近原则,将静态资源路径从左往右寻找最近的一个资源返回给浏览器。

资源路径

访问项目静态资源:http://localhost:8080/baidu.png
对应的系统本地静态资源:H:\AFile\baidu.png

说白了就是项目路径http://localhost:8080/后面的资源名称会对应在系统本地路径H:\AFile\的后面
SpringBoot设置文件虚拟路径映射_第3张图片

路径规则
本地绝对路径替换掉本地静态资源路径项目静态资源路径

H:\AFile\baidu.png替换掉H:\AFile\localhost:8080/等于http://localhost:8080/baidu.png

验证

光说没用,下面来验证一下上面的说法:

浏览器访问http://localhost:8080/baidu.png看看效果:
SpringBoot设置文件虚拟路径映射_第4张图片

我们访问的一直是H:\AFile下的资源文件,那如果我新建文件夹然后在里面放上文件会怎么样呢?

H:\AFile下新建一个A文件夹,里面放上一张360.png图片
SpringBoot设置文件虚拟路径映射_第5张图片
我们套用路径规则来访问一下:
本地绝对路径替换掉本地静态资源路径项目静态资源路径

H:\AFile\A\360.png替换掉H:\AFile\http://localhost:8080/等于http://localhost:8080/A/360.png

注意:本地路径的斜杠\需要换成项目路径的斜杠/

浏览器访问http://localhost:8080/A/360.png:
SpringBoot设置文件虚拟路径映射_第6张图片

使用配置类

新建一个Java类名称自定义,加上注解@Configuration就是一个配置类,实现WebMvcConfigurer接口并重写addResourceHandlers()方法:

@Configuration
public class MvcConfig implements WebMvcConfigurer {
     
    //设置文件虚拟路径映射
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
     
        registry.addResourceHandler("/test/**").addResourceLocations("file:H:\\AFile\\");
    }
}
  • addResourceHandler:添加一个资源处理程序,用于根据指定的 URL 路径模式提供静态资源。 将为与指定路径模式之一匹配的每个传入请求调用处理程序。
  • addResourceLocations:添加一个或多个用于提供静态内容的资源位置。 每个位置都必须指向一个有效的目录。 可以将多个位置指定为逗号分隔的列表,并且将按照指定的顺序检查给定资源的位置。

白话文解释

  • addResourceHandlers:添加项目静态资源路径
  • addResourceLocations:将项目静态资源映射到本地指定的资源路径
registry.addResourceHandler("/test/**").addResourceLocations("file:H:\\AFile\\");

连起来说白了就是localhost:8080/test/该路径下访问的静态资源对应着本地H:\AFile\目录下的资源文件。

演示

将之前的配置全部注释掉:
SpringBoot设置文件虚拟路径映射_第7张图片
例如我要访问百度这张图片
SpringBoot设置文件虚拟路径映射_第8张图片
这里依然可以套用路径规则
本地绝对路径替换掉本地静态资源路径项目静态资源路径

H:\AFile\baidu.png替换掉H:\AFile\localhost:8080/test/等于localhost:8080/test/baidu.png

浏览器访问localhost:8080/test/baidu.png
SpringBoot设置文件虚拟路径映射_第9张图片
访问H:\AFile\A\下的360.png

H:\AFile\A\360.png替换掉H:\AFile\localhost:8080/test/等于localhost:8080/test/A/360.png

浏览器访问localhost:8080/test/A/360.png
SpringBoot设置文件虚拟路径映射_第10张图片

SpringBoot设置文件虚拟路径映射教程结束!!!

你可能感兴趣的:(SpringBoot,SpringMVC,spring,boot,后端,java,spring)