一、什么是虚拟路径?
举个例子:上传一张图片放到:D://group/29015054169244_投影.png
但是前台访问是这样的:http://ip:port/image/29015054169244_投影.png
显然这种访问方式,应该是在tomcat下的项目静态资源文件夹下了,但是图片不在那里存放,为什么能访问到?
这就是虚拟路径的作用了。
二、为什么需要虚拟路径?
1、业务数据(资源)与代码分离,防止盘符不够或者后续修改重新部署等丢失;
2、当项目被打包成一个.jar
文件部署时,再将上传的文件放到这个.jar
文件中是有多么低的效率;
3、网站数据的备份将会很痛苦。
三、虚拟路径的配置:
1、tomcat 配置方式:con/server.xml (docBase就是实际的路径,path是虚拟路径,相当于把改路径映射到服务器中)
<!-- 设置图片虚拟路径[访问时路径为/image] -->
<Context path="/image" docBase="D:\group" reloadable="true" />
2、springboot 配置方式:
2-1、配置类:
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/** * 图片绝对地址与虚拟地址映射 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//文件磁盘图片url 映射
//配置server虚拟路径,handler为前台访问的目录,locations为files相对应的本地路径
registry.addResourceHandler("/image/**").addResourceLocations("file:///D:/group/"); }
}
2-2、 另一种直接在配置文件application.properties配置方式(这种是把项目下所有的静态资源访问映射到D:/group/下):
其中upload.download.path:自定义的属性,指定了一个路径,注意要以/
结尾;
spring.mvc.static-path-pattern=/**
表示所有的访问都经过静态资源路径;
spring.resources.static-locations
在这里配置静态资源路径,覆盖默认配置,所以需要将默认的也加上,否则static
、public
等这些路径将不能被当作静态资源路径,在这个最末尾的file:${
upload.download.path}
之所有要加file:
是因为指定的是一个具体的硬盘路径,其他的使用classpath
指的是系统环境变量。
server.port=1122
upload.download.path=D:/group/
spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/,file:${upload.download.path}
3、eclipse下配置:(参考网上的留着做参考用,未经验证。。)
四、独立静态资源管理系统的实现(通过数据流来读取图片)
1、系统中需要用到大量的图片和其他静态文件资源,考虑静态资源的统一管理和服务器性能(静态资源缓存等等,后话暂时不提),需要和restfulAPI接口分开,于是有了这个独立的静态资源管理系统(实际项目中是独立于其他接口的,也是独立分配了服务器部署的。)
2、比如上传一张图片,会自动根据类型和分组情况放到预先配置好的路径下,新的分组会新建文件夹存放,然后把类型和分组和图片名称一起存入数据库待用。
访问这张图片:*/downloadImgOrVideo.do?type=12&path=group1/29015054169244_投影.png
客户端并不知道图片的真实存放位置,但是可以把类型和“分组路径”发给服务端,服务端根据两者信息,去配置好的实际路径下寻找这个图片。