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

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

目录
相关文章
|
1月前
|
Java API 网络架构
深入理解 Spring Boot 中的 @RestController 注解:概念与实践
【4月更文挑战第20天】在现代Web开发中,创建RESTful服务已成为常态。Spring Boot通过提供@RestController注解,极大简化了REST API的开发过程。本篇博客旨在详细介绍@RestController的概念、优势以及在Spring Boot项目中的具体应用方法。
58 8
|
1月前
|
Java 开发者 Spring
深入理解 Spring Boot 中的 @EnableAutoConfiguration 注解:概念与实践
【4月更文挑战第21天】在 Spring Boot 项目中,@EnableAutoConfiguration 注解是实现自动配置的核心,它可以根据项目的依赖和配置,自动地配置 Spring 应用程序中的 Bean
47 3
|
6天前
|
XML Java UED
使用 Spring Boot 实现重试和补偿功能:从理论到实践
【6月更文挑战第17天】在分布式系统中,服务之间的调用可能会因为网络故障、服务器负载等原因偶尔失败。为了提高系统的可靠性和稳定性,我们经常需要实现重试和补偿功能。
33 6
|
4天前
|
XML 缓存 Java
Spring Boot 优雅实现降级功能:Hystrix 与 Resilience4j 的实践
【6月更文挑战第19天】在分布式系统中,服务降级是一种重要的容错机制。当某个服务不可用或响应慢时,降级机制可以保证系统的整体稳定性。本文将详细介绍如何在 Spring Boot 中使用 Hystrix 和 Resilience4j 实现降级功能。
26 7
|
5天前
|
NoSQL 算法 Java
使用 Spring Boot 实现限流功能:从理论到实践
【6月更文挑战第18天】在微服务和高并发系统中,限流(Rate Limiting)是一种非常重要的技术手段,用于保护系统免受过载,确保服务的稳定性。限流可以控制请求的速率,防止单个客户端或恶意用户消耗过多的资源,从而影响其他用户。
15 5
|
3天前
|
前端开发 安全 Java
实现Spring Boot中的文件分片上传通常涉及到以下几个步骤和考虑的关键点
实现Spring Boot中的文件分片上传通常涉及到以下几个步骤和考虑的关键点
15 2
|
1月前
|
安全 JavaScript Java
springboot实现文件防盗链设计
`shigen`,一位专注于Java、Python、Vue和Shell的博主,分享成长和技术。近期将探讨SpringBoot实现图片防盗链,通过限制`Referer`防止资源被盗用。基础版通过`WebMvcConfigurer`配置静态资源,升级版添加拦截器检查`Referer`,确保请求来源合法性。详细代码实现和案例可在文中链接找到。一起学习,每天进步!
65 14
springboot实现文件防盗链设计
|
16天前
|
小程序 JavaScript Java
基于SpringBoot+Vue+uniapp微信小程序的“返家乡”高校暑期社会实践微信小程序的详细设计和实现
基于SpringBoot+Vue+uniapp微信小程序的“返家乡”高校暑期社会实践微信小程序的详细设计和实现
11 1
|
1月前
|
NoSQL Java MongoDB
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
【5月更文挑战第11天】本文介绍了如何将非关系型数据库MongoDB与Spring Boot框架集成,以实现高效灵活的数据管理。Spring Boot简化了Spring应用的构建和部署,MongoDB则以其对灵活数据结构的处理能力受到青睐。集成步骤包括:添加MongoDB依赖、配置连接信息、创建数据访问对象(DAO)以及进行数据操作。通过这种方式,开发者可以充分利用两者优势,应对各种数据需求。在实际应用中,结合微服务架构等技术,可以构建高性能、可扩展的系统。掌握MongoDB与Spring Boot集成对于提升开发效率和项目质量至关重要,未来有望在更多领域得到广泛应用。
【MongoDB 专栏】MongoDB 与 Spring Boot 的集成实践
|
23天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的程序设计实践项目管理系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的程序设计实践项目管理系统的详细设计和实现(源码+lw+部署文档+讲解等)