账暴 发表于 2025-9-25 19:51:01

SpringBoot读取Resources下的文件

SpringBoot读取Resources下的文件

背景

在开发时候遇到需要通过 Resources 目录下某个 excel 文件作为模板生成文件。但遇到 POI 读取文件的时候发生了 No valid entries or contents found, this is not a valid 00xML (office open XML) fil.​ 的错误,该错误表示读取的文件格式是错误的。
通过对同一份文件从 Resources 下读取和外部读取发现,两者的文件大小不一致,且 Resources 下的文件已经损坏。
造成此问题可能的情况是(当时忘记查看 pom.xml,以下纯属猜测)
        <build>
      <resources>
                       
            <resource>
                <directory>src/main/resources</directory>
                               
                <filtering>true</filtering>
            </resource>
      </resources>
    </build>目标


[*]可以在运行时读取到 Resources 下的文件
[*]消除 POI 读取的错误
具体操作

修改pom.xml文件

<build>
   <resources>
      <resource>
          <directory>src/main/resources</directory>
          <filtering>false</filtering>
      </resource>
   </resources>
</build>


<build>
   <plugins>
        <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                maven-resources-plugin</artifactId>
                <configuration>
                <nonFilteredFileExtensions>
                       
                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                </nonFilteredFileExtensions>
                </configuration>
        </plugin>
   </plugins>
   <resources>
      <resource>
         <directory>src/main/resources</directory>
         <filtering>true</filtering>
      </resource>
   </resources>
</build>读取Resources下的文件

// 方案一
File file = new File("D:\\1.xlsx");
InputStream resourceAsStream = ScheduleTask.class.getClassLoader().getResourceAsStream("1.xlsx");
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(resourceAsStream.readAllBytes());
fileOutputStream.flush();
fileOutputStream.close();
resourceAsStream.close();

// 方案二
File file = ResourceUtils.getFile("classpath:1.xlsx");
FileInputStream fileInputStream = new FileInputStream(file);
FileOutputStream fileOutputStream = new FileOutputStream("D:\\1.xlsx");
fileOutputStream.write(fileInputStream.readAllBytes());
fileOutputStream.flush();
fileOutputStream.close();
fileInputStream.close();总结


[*]POI读取错误主要是由于在build的时候文件没有被正确的写入进去,只需要调整pom.xml文件的调整即可使得POI正确的读取到文件。
[*]实践中采用pom.xml修改中的第一种方案发现其与nacos貌似存在冲突,建议采用方案二。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: SpringBoot读取Resources下的文件