Linux下 Spring Boot 上传找不到临时目录, 出现500错误

Temp Error

错误原因

Linux 系统中,Spring Boot 应用以 java -jar 命令启动时,会在操作系统的 /tmp 目录下生成一个 tomcat(或 undertow )临时目录,上传的文件先要转换成临时文件保存在这个文件夹下面。由于临时 /tmp 目录下的文件,在长时间(10天)没有使用的情况下,系统执行了 tmp 目录清理服务(systemd-tmpfiles-clean.service),导致 /tmp/undertow...8090 文件被清理,然而在上传的时候,undertow 服务器需要创建/tmp/undertow...8090/undertow...upload 临时文件,但是调用 Files.createFile(...) 的时候就会发现找不到父目录,才导致了以上的错误。

具体错误日志(参考)

undertow

java.nio.file.NoSuchFileException: /tmp/undertow.17753558642503713859.8085/undertow7370242804103803588upload

Tomcat

The temporary upload location [/tmp/tomcat.7957874575370093230.8088/work/Tomcat/localhost/ROOT] is not valid

重现方法

找到类 io.undertow.server.handlers.form.MultiPartParserDefinition
定位到如下代码

@Override
public 
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,你可以尝试以下的代码: ```java @RestController @RequestMapping("/upload") // 定义请求URL前缀 public class FileUploadController { private final String UPLOAD_DIR = "/path/to/upload/dir"; // 定义上传目录 @PostMapping("/docx") // 定义POST请求URL public String uploadDocxFiles(@RequestParam("files") MultipartFile[] files) { // 检查上传目录是否存在,如果不存在,则创建 File uploadDir = new File(UPLOAD_DIR); if (!uploadDir.exists()) { if (!uploadDir.mkdirs()) { return "Failed to create upload directory!"; } } // 遍历上传的文件 for (MultipartFile file : files) { try { String fileName = file.getOriginalFilename(); String filePath = UPLOAD_DIR + "/" + fileName; // 将文件保存到指定目录 file.transferTo(new File(filePath)); } catch (Exception e) { return "Failed to upload " + file.getOriginalFilename() + " => " + e.getMessage(); } } return "Files uploaded successfully!"; } } ``` 以上代码定义了一个 `FileUploadController` 类,用于接收批量上传的docx文件。在类上加上了 `@RestController` 和 `@RequestMapping` 注解,用于定义请求的URL前缀。在类中实现了一个用于批量上传docx文件的方法 `uploadDocxFiles`,使用了 `@PostMapping` 注解来定义POST请求的URL。在这个方法内部,首先检查上传目录是否存在,如果不存在,则创建。接着遍历上传的文件,将文件保存到指定的上传目录中。 注意,你需要将代码中的 `UPLOAD_DIR` 和 `/path/to/upload/dir` 替换为你要上传到的Linux服务器的目录。 以上代码是用Java语言在Spring Boot框架下实现的,可以将其打包为一个jar文件运行,然后通过Postman等工具测试上传功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值