Spring Boot获取自己jar包中的文件(如pdf合同模板)

描述:
在开发过程中常常会遇到业务需要对合同模板进行修改的场景,如果遇见一个不会改变的合同模板的话可以放到jar包,并且设置为一个软引用缓存,会提高一部分读取文件的速度。
代码如下:

	// pdf文件字节流的软引用
	private static SoftReference<byte[]> softPdf;
	
	/**
     * @param response http响应信息
     * @return 获取pdf文件
     */
    @RequestMapping(value = "/testPdf", method = RequestMethod.GET)
    public ResponseEntity testPdf(HttpServletResponse response) {
        response.setContentType(MediaType.APPLICATION_OCTET_STREAM.toString());
        response.setHeader("Content-Disposition", "attchement;filename=" + "aaa.pdf");
        try (ServletOutputStream outputStream = response.getOutputStream()) {
            // 默认路径为resource 文件夹下
            outputStream.write(getSoftPdfByte("aaa.pdf"));
        } catch (IOException e) {
            return getErrMsgResponseEntity("文件传输发生异常");
        }
        return new ResponseEntity(HttpStatus.OK);
    }

    /**
     * @param filePath resources包下的文件路径
     * @return 返回文件对应的字节流
     * @throws IOException 
     * 模仿boot获取banner的方式来获取resources下的文件
     * 通过文件路径获取对应的字节流
     */
    private byte[] getSoftPdfByte(String filePath) throws IOException {
        // 1.判断软引用是否被回收了,如果没有回收的话直接返回
        if (softPdf != null && softPdf.get() != null) {
            // fixme 待测试此处是否会被回收
            return softPdf.get();
        }
        // 2.获取默认类加载器
        ClassLoader defaultClassLoader = ClassUtils.getDefaultClassLoader();
        DefaultResourceLoader defaultResourceLoader = new DefaultResourceLoader(defaultClassLoader);
        // 3.获取resources路径下的 aaa.pdf 文件
        org.springframework.core.io.Resource resource = defaultResourceLoader.getResource(filePath);
        if (resource.exists()) {
            // 4.创建软引用对象
            byte[] pdfBytes = IoUtil.read(resource.getInputStream());
            softPdf = new SoftReference<>(pdfBytes);
            // 5.防止在创建软引用后发生了回收,所以不返回 softPdf.get(),直接返回byte[] 对象
            return pdfBytes;
        } else {
            // 6.测试代码
            return null;
        }
    }

    /**
     * @param errMsg 错误信息
     * @return 通用错误返回信息
     */
    private ResponseEntity<byte[]> getErrMsgResponseEntity(String errMsg) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("errorMsg", errMsg);
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        HttpStatus statusCode = HttpStatus.OK;
        return new ResponseEntity(jsonObject, headers, statusCode);
    }
    
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

b0b0大魔王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值