springboot重写适配器addResourceHandler 虚拟路径映射文件磁盘路径 读取磁盘文件 预览文件

文件上传的功能很常见,但是很多人并不清楚文件上传后预览的具体原理,也就是把上传至服务器指定物理磁盘相关目录(绝对路径)的文件通过浏览器直接访问预览。这种具体实现其实是要配置一个映射关系的,即配置一个虚拟路径来映射文件的真实绝对路径(完美的隐藏了文件的真实物理路径,可以说不但很安全,而且外网可以直接访问)。

配置虚拟路径映射物理路径常规二种方式

方式一:在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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章