SpringBoot实践:上传图片文件时,报临时目录不存在

简介: SpringBoot实践:上传图片文件时,报临时目录不存在

大家都知道,现在SpringBoot框架,已经是非常流行的Java快速开发框架,替代了以前传统的SSM/SSH时代的XML配置,零XML配置就可以跑起一个jar企业应用,只需要通过各种“注解”来进行配置。而且SpringBoot内部集成了Tomcat/Undertow的Web服务器,不需要在以前一样,先要在服务器上放一个Tomcat/Undertow,然后在项目打成war包放到容器里进行运行,无论从使用上,效率上都提升了很多。

虽然SpringBoot做了很多简化,但还是基于spring、springmvc、web相关框架的那些类及API,还是要有了解,不然有进也会遇到不可预知的“坑”。为了便于后人,顺便把这些整理成文章。

一、问题产生的背景

今天小伙伴写的一个系统,是基于SpringBoot,业务人员在操作时,发现上不传了图片/文件,业务人员说之前是可以上传,不知为什么今天上传不了。

二、问题的分析

既然发现了问题,那就从程序输出的日志上找原因吧,找到服务对应的日志,通过简单的grep命令,找到如下一段异常:

org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; 
nested exception is java.io.IOException: The temporary upload location [/tmp/tomcat.1312576899112123874.8089/work/Tomcat/localhost/ROOT] is not valid

如图所示:
image.png

这个错误提示是:“临时上传的目录非法”。小伙伴很奇怪,项目里明明没有配置这个目录,为什么会用到这个目录呢?

原来,SpringBoot框架中在上传附件时,会先缓存到本地磁盘上(注意:http流是一次消费的,后续无法在次使用,所以要先缓存起来),以便后续的复用。而在没有明确指定缓存的目录时,SpringBoot默认是在/tmp目录下的。

从这个报错看是这个目录可能不存在/或者权限不够之类。进入服务器后,结果发现没有这个目录,为什么这个目录会不见了呢?

查找linux的资料,发现linux有这样的机制:

在linux中,tmp目录可以删除;该目录用于存储临时性的文件,该目录会默认清理指定天数未用的文件,系统重启会清空目录,“/tmp”目录默认清理10天未用的文件,“/var/tmp”目录默认清理30天未用的文件。

三、解决的办法

既然知道了问题的原因,针对这个问题有多种解决办法。

1、 临时解决办法(不便于及时改配置部署)

重启下应用服务,让应用服务重新生成目录(SpringBoot中的tomcat在重启后,会在/tmp目录下,重新生成一个临时的目录) -- 但以后还是会面临时被清除。

2、 修改linux的配置,让其不清除这类文件(可能会堆积,不建议)

vim /usr/lib/tmpfiles.d/tmp.conf
# 添加下面一行
/tmp/tomcat.*

3、 增加启动参数

启动springBoot程序,添加使用指定临时目录的启动参数 -java.tmp.dir=你想的目录

4、修改SpringBoot的properties文件

找到项目的application.properties文件,在基中添加以下配置,让其使用其他目录,不使用/tmp目录

server.tomcat.basedir=你想的目录

spring.http.multipart.location=你想的目录

好了,至此,上传的临时目录问题解决。看到此文章的小伙伴,可收藏起来,以备后续之需,必竟在做系统的过程中,上传图片/附件是很常见的功能。

目录
相关文章
|
2月前
|
并行计算 Java 数据处理
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
SpringBoot高级并发实践:自定义线程池与@Async异步调用深度解析
223 0
|
22天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
68 5
|
23天前
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
37 5
|
23天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
38 5
|
1月前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
95 1
SpringBoot获取项目文件的绝对路径和相对路径
|
1月前
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
46 11
|
2月前
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
117 4
springboot + minio + kkfile实现文件预览
|
1月前
|
存储 前端开发 JavaScript
|
1月前
|
存储 Java API
|
26天前
|
Java 测试技术 数据库连接
使用Spring Boot编写测试用例:实践与最佳实践
使用Spring Boot编写测试用例:实践与最佳实践
58 0