文件上传的功能很常见,但是很多人并不清楚文件上传后预览的具体原理,也就是把上传至服务器指定物理磁盘相关目录(绝对路径)的文件通过浏览器直接访问预览。这种具体实现其实是要配置一个映射关系的,即配置一个虚拟路径来映射文件的真实绝对路径(完美的隐藏了文件的真实物理路径,可以说不但很安全,而且外网可以直接访问)。
配置虚拟路径映射物理路径常规二种方式
方式一:在tomcat的tomcat-7.0.39/conf/Catalina/localhost/目录配置一个xml文件,该xml文件里配置物理路径和虚拟路径的映射关系,同时该xml文件的名字须定义为要映射的虚拟路径即可。该种方式很简单,此处不再赘述。
方式二:在项目中增加适配器配置类,在该配置类中定义虚拟路径和真实的物理路径的映射关系即可。该种方式因不同的框架实现不一样,本案例通过主流的springboot讲解该配置以及具体应用。
具体实现:首先在本地磁盘目录放置一个图片文件,目录如下
D:\uploadBaseDir\productPic\20190215\100×100\8e67898584e140c9b39a203a167f58fe.png
接下来在项目里定义一个适配器配置类ResourceConfigAdapter继承WebMvcConfigurerAdapter,注意这里要动态的获取操作系统,根据不同的操作系统适配不同的映射关系,也很好理解,windows系统有C/D盘这个概念(真实的物理磁盘路径),linux和mac系统没有这个概念,都是相对路径。
package com.demo.serverProvider.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
/**
* 创建时间:2019年2月15日 下午1:52:49
* 项目名称:server-provider
* 类说明:将物理磁盘文件存放的绝对路径映射为一个虚拟路径,就可以通过SpringBoot服务来访问文件了
* @author guobinhui
* @since JDK 1.8.0_51
*/
@Configuration
public class ResourceConfigAdapter extends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
String os = System.getProperty("os.name");
if (os.toLowerCase().startsWith("win")) { //如果是Windows系统
registry.addResourceHandler("/productPic/**").
addResourceLocations("file:D:/uploadBaseDir/productPic/");
}else{//linux和mac系统
registry.addResourceHandler("/productPic/**").
addResourceLocations("file:/uploadBaseDir/productPic/");
}
super.addResourceHandlers(registry);
}
}
最终图片上传结束在数据库里保存存储的相对路径即可,本图片保存的路径如为:/uploadBaseDir/productPic/20190215/100×100/8e67898584e140c9b39a203a167f58fe.png
最终测试刚才这个图片的预览(可以看到真实物理路径D:/uploadBaseDir/productPic/映射为指定的虚拟路径/productPic/了)
欢迎各位开发者朋友一起交流。笔者电话(微信):18629374628