前言
服务打成jar包到服务器里,代码读取不了jar包里的模板
一、问题
如何读取jar包中的模板或者文件
二、使用步骤
1.服务启动前读取模板文件到jar包同一个目录
代码如下:
@Component
public class TemplateInitRunnerImpl implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
List<String> list = new ArrayList<>();
list.add("psi.xlsx");
list.add("bidpro.xlsx");
list.add("contractpro.xlsx");
list.add("userinfo.xlsx");
list.add("agentinfo.xlsx");
list.add("hospitalinfo.xlsx");
// 获取jar包所在目录
ApplicationHome h = new ApplicationHome(getClass());
File jarF = h.getSource();
System.out.println("*********" + jarF.getParentFile().toString() + "*********");
for (String tname : list) {
// 模板文件获取
ClassPathResource cpr1 = new ClassPathResource("template/"+tname);
File file1 = new File(jarF.getParentFile().toString() + File.separator + "template" + File.separator + tname);
FileOutputStream outputStream1 = null;
if (!file1.exists()) {
try {
//创建文件夹
File directory = new File(jarF.getParentFile().toString() + File.separator + "template");
directory.mkdir();
// 创建文件
file1.createNewFile();
outputStream1 = new FileOutputStream(file1);//形参里面可追加true参数,表示在原有文件末尾追加信息
byte[] bdata = FileCopyUtils.copyToByteArray(cpr1.getInputStream());
outputStream1.write(bdata);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
outputStream1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
}
2.读取数据
代码如下:
/**
* @author zh
* @// TODO: 2020-10-22 excel导入过程处理
*/
@RestController
@RequestMapping("/downloadExcel")
public class DownloadExcelController {
/**
* excel 模板下载
*
* @param
* @return
*/
@PostMapping("/download/{filename}")
public void downloadExcel(@PathVariable("filename") String filename, HttpServletRequest request, HttpServletResponse response) throws IOException {
try {
//设置要下载的文件的名称
response.setHeader("Content-disposition", "attachment;fileName=" + filename);
//通知客服文件的MIME类型
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
// 获取jar包所在目录
ApplicationHome h = new ApplicationHome(getClass());
File jarF = h.getSource();
//获取文件的路径
String filePath = jarF.getParentFile().toString()+File.separator+"template" + File.separator +filename;
// getClass().getResource("/template/" + filename).getPath();
FileInputStream input = new FileInputStream(filePath);
OutputStream out = response.getOutputStream();
byte[] b = new byte[2048];
int len;
while ((len = input.read(b)) != -1) {
out.write(b, 0, len);
}
//修正 Excel在“xxx.xlsx”中发现不可读取的内容。是否恢复此工作薄的内容?如果信任此工作簿的来源,请点击"是"
response.setHeader("Content-Length", String.valueOf(input.getChannel().size()));
input.close();
//return Response.ok("应用导入模板下载完成");
} catch (Exception ex) {
ex.printStackTrace();
//return Response.ok("应用导入模板下载失败!");
}
}
}
总结
Java中常规的读取文件方法不能读取压缩包里的文件,可以通过运行前把文件读取到jar包外的文件夹,再去读取