下面是“SpringBoot上传临时文件被删除引起报错的解决”的完整攻略,包含两条示例说明。
问题描述
在使用SpringBoot进行文件上传时,因为上传的是临时文件,所以会自动在一定时间后被删除,但是如果在这段时间内访问这个文件就会报错,如下所示:
java.io.FileNotFoundException: /var/folders/xd/m81ynvt15cv0_kyp1p13v9k00000gn/T/upload_4dbb2b6a_c82d_4758_9a3e_c275df593977148.png (No such file or directory)
解决方案
对于这个问题,可以通过在配置文件中修改上传文件的临时存储位置和存在时间来解决。
- 修改上传文件的临时存储位置
在application.yml
中增加以下配置项:
spring:
servlet:
multipart:
location: /tmp # 修改为自定义的文件夹路径
这样就将上传的临时文件放在了/tmp
文件夹下,而不是默认的系统临时文件夹。这里我们将其路径修改为/tmp
,如果需要修改为其他路径也可以。
- 修改临时文件存活时间
在application.yml
中增加以下配置项:
spring:
servlet:
multipart:
file-size-threshold: 0
max-file-size: 20MB
max-request-size: 20MB
resolve-lazily: true
clean-up:
cron: "0 0 0 * * *" # 每天0点清理临时文件
其中clean-up: cron
就是用来配置定时清理临时文件的时间的,表示每天的0点清理。可以根据实际情况进行配置。
示例说明
下面通过两个示例来说明这个问题的解决方案。
示例一:上传文件后立即访问
如果上传文件后立即访问,就会出现上述问题,如下所示:
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) throws IOException {
String originalFilename = file.getOriginalFilename();
Path filePath = Paths.get("tmp", originalFilename);
file.transferTo(filePath.toFile());
byte[] bytes = Files.readAllBytes(filePath);
return new String(bytes);
}
这个示例通过transferTo()
方法将文件保存到了/tmp
下,然后通过Files.readAllBytes()
方法读取文件内容,并返回了一个字符串。如果在这个HTTP请求处理完成后立即访问,则会出现上述的文件不存在的错误。
通过修改配置文件中的spring.servlet.multipart.location
配置项,可以将文件保存在指定位置。
spring:
servlet:
multipart:
location: /uploads
这个时候再次进行本地测试,就不会出现上述报错,因为文件已经被正常保存了。
示例二:临时文件存活时间
下面我们来演示如何通过配置文件中的clean-up: cron
配置项来实现临时文件存活时间的修改。
在配置文件中增加以下配置项:
spring:
servlet:
multipart:
clean-up:
cron: "0 0/5 * * * ?" # 每5分钟清理一次
这个配置表示每5分钟清理一次临时文件。我们可以在本地启动应用,然后使用Postman来进行测试。
首先,我们上传一个大小为5MB
的文件。
然后,访问上传文件的链接,可以正常访问。
等待5分钟后,重新访问这个链接,就会发现文件已经被清理了。
总之,通过修改配置文件中的spring.servlet.multipart.location
和clean-up: cron
配置项,就可以解决临时文件被删除引起的报错问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot上传临时文件被删除引起报错的解决 - Python技术站