Caused by: java.io.FileNotFoundException:项目目录

在初学SpringMVC手动创建项目时启动Tomcat时,报错找不到项目的目录,因为突然把问题解决了就先不放报错截图了。
解决方法就是我的tomcat选择了war包的形式发布,但是我的maven的pom.xml文件中没有写上打包方式

 <groupId>com.itheima</groupId>
    <artifactId>itheima_spring_mvc</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

写上war
然后把之前的tomcat移除,
在这里插入图片描述
移除后重新添加tomcat,然后如下图,(注意选择:war exploded)
在这里插入图片描述

### Java 文件未找到异常 (`FileNotFoundException`) 的原因分析 当遇到 `java.io.FileNotFoundException` 时,通常意味着程序尝试访问不存在的文件或路径。具体来说: - 对于 Spring Boot 中的异步文件上传操作,临时文件可能在处理之前已经被删除或者移动[^1]。 - 在某些情况下,Tomcat 或其他应用服务器可能会清理临时目录中的文件,这可能导致后续读取这些文件的操作失败[^3]。 #### 解决方案概述 为了有效解决这个问题,可以从以下几个方面入手: 1. **调整 Tomcat 配置** 修改 Tomcat 的工作目录设置,确保其不会频繁清除临时文件夹内的内容。可以在 `application.properties` 或者 `application.yml` 文件中配置如下属性来改变默认的工作目录位置: ```properties spring.servlet.multipart.location=/path/to/custom/temp/dir/ ``` 2. **优化文件保存逻辑** 使用自定义的方式存储上传后的文件而不是依赖框架自带的方法。例如,在接收到 MultipartFile 后立即将其转换成字节数组并写入目标位置,这样可以避免多次调用 transferTo 方法带来的问题: ```java @PostMapping("/upload") public ResponseEntity<String> handleFileUpload(@RequestParam("file") MultipartFile file) { try (InputStream inputStream = file.getInputStream()) { byte[] bytes = IOUtils.toByteArray(inputStream); Path path = Paths.get("/your/desired/path/" + file.getOriginalFilename()); Files.write(path, bytes); return ResponseEntity.ok("Successfully uploaded"); } catch (IOException e) { throw new RuntimeException(e.getMessage(), e); } } ``` 3. **检查权限和路径有效性** 确认应用程序有足够的权限去创建、修改以及读取指定的目标文件夹;同时验证所提供的绝对路径是否正确无误[^2]。 4. **日志记录与调试** 增加详细的日志输出以便更好地追踪错误发生的具体环节,并通过打印堆栈跟踪信息进一步定位潜在的问题根源。 5. **考虑使用内存缓存机制** 如果上传的数据量不大,则可以直接将其加载至 JVM 内存空间内完成整个流程而无需落地磁盘,从而减少对外部资源的依赖程度。 ```java // 示例代码片段展示如何利用ByteArrayOutputStream替代transferTo() public void saveToFile(MultipartFile multipartFile){ ByteArrayOutputStream byteArrayOutputStream = null; try{ File targetFile = new File(destinationPath); if (!targetFile.exists()){ targetFile.mkdirs(); } byteArrayOutputStream = new ByteArrayOutputStream(); byteArrayOutputStream.write(multipartFile.getBytes()); FileOutputStream fos = new FileOutputStream(targetFile); fos.write(byteArrayOutputStream.toByteArray()); fos.flush(); fos.close(); }catch(Exception ex){ logger.error(ex.toString()); }finally{ if(null !=byteArrayOutputStream){ try{byteArrayOutputStream.close();}catch(IOException io){} } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值