前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springboot读取resource下的文件 – 打包后可用

Springboot读取resource下的文件 – 打包后可用

作者头像
收心
发布2023-12-27 09:14:45
3430
发布2023-12-27 09:14:45
举报
文章被收录于专栏:Java实战博客Java实战博客

原理讲解

在Spring Boot应用程序中,如果您尝试将应用程序打包成一个 JAR 并运行,那么您不能使用FileFileInputStream来直接读取 JAR 内部的文件,因为这些文件不是以传统文件系统的形式存在的。相反,它们被嵌入到了 JAR 文件中,必须通过类加载器来访问。那么您应该始终使用类路径访问方式(ClassLoader.getResourceAsStream或Spring的ResourceLoader),而不是尝试直接访问文件系统路径。

示例一:读取文件内容 + 下载文件

这个文件放在src/main/resource文件夹下放了一个dapdownload文件夹,放置一个文件叫:mock.txt,这里是读取该文本并返回。

注意打包后,需要确定相关资源在jar包内部!

代码语言:javascript
复制
    @GetMapping("/getXXProjectLists")
    @Operation(summary = "获得XX项目列表")
    private String getXXProjectLists() {
        /*
        下面2个方式在打成jar包后,是无法找到文件的!所以仅供本地idea调试的使用使用。
        return FileUtil.readUtf8String("dapdownload/mock.txt");
        return FileUtil.readUtf8String(new ClassPathResource("dapdownload/mock.txt").getPath());
        */
        try {
            ClassPathResource classPathResource = new ClassPathResource("dapdownload/mock.txt");
            // 使用StreamUtils来从InputStream中读取字符串
            String content = StreamUtils.copyToString(classPathResource.getInputStream(), StandardCharsets.UTF_8);
            return content;
        } catch (IOException e) {
            e.printStackTrace();
            return "Error reading file";
        }
    }

    @GetMapping("/downloadFile")
    @Operation(summary = "下载XX文件")
    public void downloadFile(HttpServletResponse response, String fileName) {
        try {
            Resource resource = new ClassPathResource("dapdownload/" + fileName); // 文件名可以根据实际情况更改
            // 设置响应内容类型
            String contentType = "application/octet-stream";
            if (resource.exists()) {
                contentType = determineContentType(resource);
            }
            response.setContentType(contentType);

            // 设置响应头,指定文件名
            response.setHeader("Content-Disposition", "attachment; filename=" + resource.getFilename());

            // 读取文件并写入响应输出流
            InputStream inputStream = resource.getInputStream();
            OutputStream outputStream = response.getOutputStream();
            byte[] buffer = new byte[4096];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                outputStream.write(buffer, 0, len);
            }
            outputStream.flush();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
            // 可以添加适当的异常处理
        }
    }

    private String determineContentType(Resource resource) throws IOException {
        return MediaType.APPLICATION_OCTET_STREAM_VALUE;
        // 在实际情况下,您可能需要使用更复杂的逻辑来确定文件的MIME类型
    }

特殊说明: 上述文章均是作者实际操作后产出。烦请各位,请勿直接盗用!转载记得标注原文链接:www.zanglikun.com 第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取全部资料 ❤

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-12-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原理讲解
  • 示例一:读取文件内容 + 下载文件
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档