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=你想的目录

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

目录
相关文章
|
XML Java Maven
springboot-多环境配置文件
本文介绍了如何创建开发和生产环境的配置文件,并在IDEA和Maven中进行配置。开发环境中,通过设置profile为`dev`来指定配置文件;生产环境中,使用Maven命令参数`-Pprod`打包并指定配置文件。公共配置可放在`application.yml`中统一管理。日志配置需确保`logback-spring.xml`中的profile正确,以保证日志正常输出。
1187 4
springboot-多环境配置文件
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,日期时间格式化是前后端交互的常见痛点。本文详细解析了 **@DateTimeFormat** 和 **@JsonFormat** 两个注解的用法,分别用于将前端传入的字符串解析为 Java 时间对象,以及将时间对象序列化为指定格式返回给前端。通过完整示例代码,展示了从数据接收、业务处理到结果返回的全流程,并总结了解决时区问题和全局配置的最佳实践,助你高效处理日期时间需求。
2088 0
|
存储 Java 数据库
Spring Boot 注册登录系统:问题总结与优化实践
在Spring Boot开发中,注册登录模块常面临数据库设计、密码加密、权限配置及用户体验等问题。本文以便利店销售系统为例,详细解析四大类问题:数据库字段约束(如默认值缺失)、密码加密(明文存储风险)、Spring Security配置(路径权限不当)以及表单交互(数据丢失与提示不足)。通过优化数据库结构、引入BCrypt加密、完善安全配置和改进用户交互,提供了一套全面的解决方案,助力开发者构建更 robust 的系统。
440 0
|
存储 前端开发 Java
Springboot静态资源映射及文件映射
在Spring Boot项目中,为了解决前端访问后端存储的图片问题,起初尝试通过静态资源映射实现,但发现这种方式仅能访问打包时已存在的文件。对于动态上传的图片(如头像),需采用资源映射配置,将特定路径映射到服务器上的文件夹,确保新上传的图片能即时访问。例如,通过`addResourceHandler("/img/**").addResourceLocations("file:E:\\myProject\\forum_server\\")`配置,使前端可通过URL直接访问图片。
869 0
Springboot静态资源映射及文件映射
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
JSON 前端开发 Java
深入理解 Spring Boot 中日期时间格式化:@DateTimeFormat 与 @JsonFormat 完整实践
在 Spring Boot 开发中,处理前后端日期交互是一个常见问题。本文通过 **@DateTimeFormat** 和 **@JsonFormat** 两个注解,详细讲解了如何解析前端传来的日期字符串以及以指定格式返回日期数据。文章从实际案例出发,结合代码演示两者的使用场景与注意事项,解决解析失败、时区偏差等问题,并提供全局配置与局部注解的实践经验。帮助开发者高效应对日期时间格式化需求,提升开发效率。
3755 2
|
前端开发 Java Nacos
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
本文介绍了如何使用Spring Cloud Alibaba 2023.0.0.0技术栈构建微服务网关,以应对微服务架构中流量治理与安全管控的复杂性。通过一个包含鉴权服务、文件服务和主服务的项目,详细讲解了网关的整合与功能开发。首先,通过统一路由配置,将所有请求集中到网关进行管理;其次,实现了限流防刷功能,防止恶意刷接口;最后,添加了登录鉴权机制,确保用户身份验证。整个过程结合Nacos注册中心,确保服务注册与配置管理的高效性。通过这些实践,帮助开发者更好地理解和应用微服务网关。
2423 0
🛡️Spring Boot 3 整合 Spring Cloud Gateway 工程实践
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
891 5
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
521 5
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
889 5