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异步调用深度解析
190 0
|
2月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
184 2
|
26天前
|
Java 应用服务中间件
SpringBoot获取项目文件的绝对路径和相对路径
SpringBoot获取项目文件的绝对路径和相对路径
63 1
SpringBoot获取项目文件的绝对路径和相对路径
|
20天前
|
网络协议 Java
springboot配置hosts文件
springboot配置hosts文件
44 11
|
2月前
|
XML Java Kotlin
springboot + minio + kkfile实现文件预览
本文介绍了如何在容器中安装和启动kkfileviewer,并通过Spring Boot集成MinIO实现文件上传与预览功能。首先,通过下载kkfileviewer源码并构建Docker镜像来部署文件预览服务。接着,在Spring Boot项目中添加MinIO依赖,配置MinIO客户端,并实现文件上传与获取预览链接的接口。最后,通过测试验证文件上传和预览功能的正确性。
springboot + minio + kkfile实现文件预览
|
25天前
|
存储 前端开发 JavaScript
|
25天前
|
存储 Java API
|
1月前
|
数据采集 Java 数据安全/隐私保护
Spring Boot 3.3中的优雅实践:全局数据绑定与预处理
【10月更文挑战第22天】 在Spring Boot应用中,`@ControllerAdvice`是一个强大的工具,它允许我们在单个位置处理多个控制器的跨切面关注点,如全局数据绑定和预处理。这种方式可以大大减少重复代码,提高开发效率。本文将探讨如何在Spring Boot 3.3中使用`@ControllerAdvice`来实现全局数据绑定与预处理。
61 2
|
2月前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
27天前
|
Java
SpringBoot获取文件将要上传的IP地址
SpringBoot获取文件将要上传的IP地址
31 0