场景:部署的Springboot项目,打成jar包,需要通过url直接访问jar外部路径的资源,本人的Springboot为2.1.11.RELEASE。
一、配置WebMvcConfigurer,设置url访问静态资源映射
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 日志记录器
*/
private static final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);
@Value("${image.baseImagePath}")
private String baseImagePath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// addResourceHandler是指你想在url请求的路径
// addResourceLocations是图片存放的真实路
registry.addResourceHandler("/image/**")
.addResourceLocations("file:" + baseImagePath)
// 可以自定义资源处理类,对加载后的资源进行二次处理,比如图片统一打标识、解密之类的
//.resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())
;
}
}
二、添加application.yml,再配置中配置访问的真是路径
############################### 图片真实存储位置 #############################
image:
baseImagePath: ./image_base64
三、服务器的部署路径创建 image_base64文件夹,和jar同级目录,里面存放需要访问的图片
例如存放了12345.jpg图片
四、启动项目,访问的 ip:端口/项目基本路径/image/12345.jpg即可查看图片,也可以支持路径嵌套,在image_base64文件夹中在创建子目录,访问的时候加上即可。
例子:本人在application.yml中配置
server:
port: 8089
servlet:
context-path: /test
图片访问路径:localhost:8089/test/image/12345.jpg
==========================如果需要对取出的资源加特殊处理======================================
1、将 .resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())加上
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
/**
* 日志记录器
*/
private static final Logger logger = LoggerFactory.getLogger(WebMvcConfig.class);
@Value("${image.baseImagePath}")
private String baseImagePath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// addResourceHandler是指你想在url请求的路径
// addResourceLocations是图片存放的真实路
registry.addResourceHandler("/image/**")
.addResourceLocations("file:" + baseImagePath)
// 可以自定义资源处理类,对加载后的资源进行二次处理,比如图片统一打标识、解密之类的
.resourceChain(true).addTransformer(new SecretImageResourceTransformerSupport())
;
}
}
2、定义自己的图片资源处理类 SecretImageResourceTransformerSupport,继承ResourceTransformerSupport,具体操作步骤可以参考Spring源码的CssLinkResourceTransformer
public class SecretImageResourceTransformerSupport extends ResourceTransformerSupport {
private static String SUPPORT_IMG = "jpg";
/** 日志记录器 */
private static final Logger logger = LoggerFactory.getLogger(SecretImageResourceTransformerSupport.class);
@Override
public Resource transform(HttpServletRequest httpServletRequest, Resource resource, ResourceTransformerChain resourceTransformerChain) throws IOException {
resource = resourceTransformerChain.transform(httpServletRequest, resource);
String filename = resource.getFilename();
if (!SUPPORT_IMG.equals(StringUtils.getFilenameExtension(filename))) {
return resource;
}
byte[] bytes = FileCopyUtils.copyToByteArray(resource.getInputStream());
// 本人做的的图片解密,你也可以根据自己需要将bytes 做其他处理
// bytes = DESUtil.decryptDES(bytes, DESUtil.DES_KEY);
resource = new TransformedResource(resource, bytes);
return resource;
}
}
3、启动服务重新访问地址栏,就可以查看自己对图片资源处理的结果。本人的代码里限制了只处理jpg格式,自己看情况而定。
原创不易,如果对你有用记得点赞哦,就是对我创作好文章的最大鼓励!!!
谢谢老板!!!