问题记录:本地项目能正常读取文件,但jar包运行无法获取文件问题!

179 阅读1分钟

问题记录

  • 读取resource/file下的模板文件
  • 本独运行情况下,根据文件地址读取文件,但打成jar包后文件会打包在jar包内classes/file路径内,所以使用src/main/resources/file/路径的方式jar包运行的情况下无法读取到文件

错误代码示例

/**
     * 加载模板文件
     *
     * @param templateName 模板文件名
     * @return 模板文件
     */
    public static PDDocument getTemplateFile(String templateName, HttpServletResponse response) {
        PDDocument document;
        try {
            String fileName = URLEncoder.encode(templateName, "UTF-8");
            response.setContentType("application/pdf");
            response.setCharacterEncoding("utf8");
            response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");
            // 加载PDF模板
            document = PDDocument.load(new File("src/main/resources/file/" + templateName + ".pdf"));
        } catch (IOException e) {
            throw new RuntimeException("加载模板文件失败!");
        }
        return document;
    }

使用new File("src/main/resources/file/" + templateName + ".pdf")的方式获取本地文件,本地运行情况下能正常读取。 开发过程中使用的该方式,项目部署后能正常使用,但经过几次项目更新后又无法获取了(这个问题有待弄清楚);大概率是因为项目部署的方式不同的原因(没有验证)

正确代码示例

public static PDDocument getTemplateFile(String templateName, HttpServletResponse response) {  
    PDDocument document;  
    try {  
        String fileName = URLEncoder.encode(templateName, "UTF-8");  
        response.setContentType("application/pdf");  
        response.setCharacterEncoding("utf8");  
        response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName + ".pdf");  
        // 加载PDF模板  
        InputStream resourceAsStream = PdfUtil.class.getClassLoader().getResourceAsStream("/file/" + templateName + ".pdf");  
        document = PDDocument.load(resourceAsStream);  
    } catch (IOException e) {  
        throw new RuntimeException("加载模板文件失败!");  
    }  
    return document;  
}