Spring Boot启动后读取jar包内部文件

项目很少会将一些需要读取的文件放在项目内部,而是放在特定的文件服务器存取(系统服务器外部);但也不排除一些小项目,只有极其少量的文件读取服务(如仅仅下载一个简单的模板文件),配置文件服务器就会显得有些大材小用,就会将这些模板文件放入项目内部进行统一打包部署

背景

一个简单的项目,用户需要根据特定格式上传一份文件进行数据导入处理,但并没有配置文件服务器什么的,只能将模板文件放入系统中读取下载;在开发环境中直接路径是可以读取(未打包),发布后发现不能读取对应的模板文件,网上搜查了一番,解决该问题。

解决方法

模板文件位置在静态目录下(直接上获取文件代码

  • 开发环境代码(开发可用,发布不可用)
/**
     * 客户信息导入模板下载
     *
     * @return 跳转页面
     */
    @GetMapping("/template_download")
    @RequiresPermissions("customer:template_download")
    public ResponseEntity<Resource> downloadTemplate() throws FileNotFoundException {
        // Spring 自带ResourceUtils路径读取
        //File file = new File("static/模板.xlsx");   // 怎么读取都是失败
        File file = ResourceUtils.getFile("classpath:static/模板.xlsx");
        InputStream inputStream = new FileInputStream(file);
        Resource resource = new InputStreamResource(inputStream);
        try {
            return ResponseEntity.ok()
                    .contentType(MediaType.parseMediaType("application/octet-stream"))
                    .header(HttpHeaders.CONTENT_DISPOSITION,
                            "attachment;fileName=" + URLEncoder.encode("客户模板.xlsx", "utf-8"))
                    .body(resource);
        } catch (UnsupportedEncodingException e) {
            log.error("文件下载异常");
            throw new ExportDataException("文件下载异常");
        }
    }
复制代码
  • 开发/发布环境(正确解法)
/**
     * 客户信息导入模板下载
     *
     * @return 跳转页面
     */
    @GetMapping("/template_download")
    @RequiresPermissions("customer:template_download")
    public ResponseEntity<Resource> downloadTemplate() throws FileNotFoundException {
        // 直接工程内部相对路径(must)
        File file = new File("src/main/resources/static/模板.xlsx");
        InputStream inputStream = new FileInputStream(file);
        // 使用CLASSPATH读取文件(路径必须/)
        // File file = new File(this.getClass().getResource("/static/模板.xlsx").toURI());
//        InputStream inputStream = this.getClass().getResourceAsStream("/static/模板.xlsx");

        Resource resource = new InputStreamResource(inputStream);
        try {
            return ResponseEntity.ok()
                    .contentType(MediaType.parseMediaType("application/octet-stream"))
                    .header(HttpHeaders.CONTENT_DISPOSITION,
                            "attachment;fileName=" + URLEncoder.encode("客户模板.xlsx", "utf-8"))
                    .body(resource);
        } catch (UnsupportedEncodingException e) {
            log.error("文件下载异常");
            throw new ExportDataException("文件下载异常");
        }
    }
复制代码

原文 

https://juejin.im/post/5cb691fc6fb9a068ab40b3a2

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » Spring Boot启动后读取jar包内部文件

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址