SpringBoot访问jar包静态文件
背景
项目开发过程中我们我们会遇到访问静态文件的情况,例如word书签模板,excel导入模板,条文法规文件等,在war包的情况下访问是没有问题的,如果使用jar包部署,使用相对路径访问会出现问题,本文就此问题给出解决方案。
配置
【SpringBoot访问jar包静态文件】resources文件夹下创建静态目录systemfile,放入测试文件test.docx(文件名需要命名为英文)
文章图片
pom文件resource/build节点设置打包编译忽略systemfile文件夹
true
src/main/resources
systemfile/*
false
src/main/resources
systemfile/*
访问 使用ClassPathResource的getInputStream获取jar包中的文件的流暂存到磁盘的临时文件中,直接访问临时文件即可
String testFilePath = ClassPathFileUtil.getFilePath("systemfile/test.docx");
public static String getFilePath(String classFilePath) {
String filePath = "";
try {
String templateFilePath = "tempfiles/classpathfile/";
File tempDir = new File(templateFilePath);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
String[] filePathList = classFilePath.split("/");
String checkFilePath = "tempfiles/classpathfile";
for (String item : filePathList) {
checkFilePath += "/" + item;
}
File tempFile = new File(checkFilePath);
if (tempFile.exists()) {
filePath = checkFilePath;
} else {
//解析
ClassPathResource classPathResource = new ClassPathResource(classFilePath);
InputStream inputStream = classPathResource.getInputStream();
checkFilePath = "tempfiles/classpathfile";
for (int i = 0;
i < filePathList.length;
i++) {
checkFilePath += "/" + filePathList[i];
if (i==filePathList.length-1) {
//文件
File file = new File(checkFilePath);
FileUtils.copyInputStreamToFile(inputStream, file);
}else{
//目录
tempDir = new File(checkFilePath);
if (!tempDir.exists()) {
tempDir.mkdirs();
}
}
}
inputStream.close();
filePath = checkFilePath;
}} catch (Exception e) {
e.printStackTrace();
}
return filePath;
}
注意 项目启动时,需要清除静态文件的临时文件,避免文件更新
@Component
@Order(value = https://www.it610.com/article/10)
public class StartUpContextimplements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
String templateFilePath ="tempfiles/classpathfile/";
File tempDir = new File(templateFilePath);
FileSystemUtils.deleteRecursively(tempDir);
System.out.println("清除classpathfile临时文件成功");
}
推荐阅读
- Activiti(一)SpringBoot2集成Activiti6
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- Android7.0|Android7.0 第三方应用无法访问私有库
- springboot使用redis缓存
- springboot整合数据库连接池-->druid
- SpringBoot中YAML语法及几个注意点说明
- springboot结合redis实现搜索栏热搜功能及文字过滤
- springboot中.yml文件的值无法读取的问题及解决
- SpringBoot整合MongoDB完整实例代码