我去,Excel文件导入失败都搞不定么----记一次Excel文件导入失败--is not valid

2024-01-21 06:59

本文主要是介绍我去,Excel文件导入失败都搞不定么----记一次Excel文件导入失败--is not valid,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

昨晚8点左右,正准备下班走人,突然,产品小姐姐的在QQ上猛地抖动了我一下。产品小姐姐果然是无事不登三宝殿。线上出了问题!!!!!!!好几个版本没有变动过的文件导入怎么突然不行了。客户催运营,运营催产品,产品催我这个小开发。哎,苦逼的程序员。

说明

本项目用的是 SpringBoot 2.x

问题重现

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

我的脑门多了许多黑人问号??/tmp/tomcat.46678487236333023.8030/work/Tomcat/localhost/extend这是个啥文件夹?上传文件为啥会操作这个文件夹?这个文件夹是啥时候创建的呢?
带着这一连串的问题,我开始了面向google的开发。 根据The temporary upload location is not valid关键字,搜索到如下结果:
在这里插入图片描述
说的是,这个文件夹没有,需要手动在tmp下创建该文件夹。然后,我就在线上用我的common用户,创建了这个文件夹,文件夹创建好之后,我接着尝试去上传Excel。紧接着又报了一个:

Failed to parse multipart servlet request; nested exception is java.io.IOException: org.apache.tomcat.util.http.fileupload.FileUploadBase$IOFileUploadException: Processing of multipart/form-data request failed. /tmp/tomcat.46678487236333023.8030/work/Tomcat/localhost/extend/upload_2062a9c2_2ecf_4176_9622_6ae54d0fe80b_00000003.tmp (权限不够)

权限不够,然后一看我这个文件夹的默认权限drwxrwxr-x,而我们项目部署的时候用的是Tomcat用户,这个用户是没有权限在我新创建的文件夹下写临时文件。
而我小小的common用户又没有权限进行chmod。无奈只能请求我们的运维帮忙,用Tomcat用户在tmp下创建这个文件夹。创建好之后,我再一试就可以。看似这个问题已经完美的解决了。但是,我的疑问还是没有被解答。

解决疑问

  1. 上传文件为啥会操作这个文件呢?
  2. /tmp/tomcat.46678487236333023.8030/work/Tomcat/localhost/extend 是啥时候创建的呢?
    带着这几个疑问,我继续google。

第一个问题 上传文件为啥会操作这个文件呢?

SpringBoot的文件上传处理是基于Servlet实现的,Content-type是multipart/form-data, boundary=“boundaryStr”,在Servlet2.5及早期版本之前,文件上传需要借助commons-fileupload组件来实现。从Servlet 3.0规范之后,提供了对文件上传的原生支持,进一步简化了应用程序的实现。
以Tomcat为例,在文件上传之后会通过将数据写入临时文件,最终将文件实体传参到应用层,如下:
在这里插入图片描述
Tomcat实现了Servlet3.0规范,通过ApplicationPart对文件上传流实现封装,其中,DiskFileItem描述了上传文件实体,在请求解析时生成该对象,需要关注的是,DiskFileItem声明了一个临时文件,用于临时存储上传文件的内容,SpringMVC对上层的请求实体再次封装,最终构造为MultipartFile传递给应用程序。
临时文件;
临时文件的路径定义:

{temp_dir}/upload_xx_xxx.tmp

temp_dir是临时目录,通过系统属性java.io.tmpdir指定,默认值为;

操作系统路径
windowsC:\Users{username}\AppData\Local\Temp\
Linux/tmp

第一个问题解决了,接着就是第二个问题,既然,上传需要用到这个文件夹,那么这个文件夹是啥时候生成的呢?

第二个问题 {temp_dir}/upload_xx_xxx.tmp 是啥时候创建的呢?

很显然,上传的时候没有生成文件夹,不然不会报is not valid那就只有可能是项目启动的时候生成的
为了验证我的想法:我在开发服务器进行了下模拟,首先,把tmp下所有tomcat为前缀的文件夹都删除了。然后重启应用。重启后查看。
在这里插入图片描述
重启之后我发现/tmp下新生成了tomcat.5195341930943680007.8030这个文件夹。跟原来的tomcat.46678487236333023.8030不一致。这么说每次项目启动之后就会生成一个新的tomcat.xxxx地址。为了验证我的猜想,我又把项目重启了一遍。再观察,果然如下,结果如下图所示:
在这里插入图片描述

解决问题

最终解决这个问题呢?一个保险的方法就是指定上传文件的临时文件夹。在SpringBoot下只需要如下配置:

spring:servlet:multipart:#开启swaggerenabled: true#最大上传文件大小max-file-size: 5MB#临时文件夹location: /srv/www/extend

或者使用配置类,如下:

@Configurationpublic static class FileConfig {@Beanpublic MultipartConfigElement multipartConfigElement() {MultipartConfigFactory factory = new MultipartConfigFactory();factory.setMaxFileSize(DataSize.parse("5MB"));factory.setMaxRequestSize(DataSize.parse("5MB"));factory.setLocation("/srv/www/extend");return factory.createMultipartConfig();}}

linux 命令查缺补漏

命令作用举例
rm -rf默默的删除文件,慎用rm -rf tomcat.* 删除所有前缀为tomcat. 的文件夹
chmod给文件赋予权限
ll查看该目录下所有文件夹以及文件的属性
rz -be用于上传大文件
sz用于下载文件sz log.text 下载log.text文件
adduser用于创建新用户adduser test
su切换用户su root 切换到root用户

chmod

我们先用 ll 查看文件,结果如下:

总用量 4
drwxr-xr-x 3 test test 4096 6月  11 15:06 work

PS: 用 ls -ld 文件夹名 例如:ls -ld work/ 可以指定查看work文件夹的属性。结果跟用ll一样的。

drwxr-xr-x3testtest40966月 11 15:06work
用户权限连接数所有者用户组文件大小修改日期文件夹名

文件类型与权限
在这里插入图片描述

  • r:表示用户可以查看该目录下的内容,即可以使用"ls"命令
  • w:表示用户可以修改该目录下的内容,包括增加、删除、重命名等
  • x: 表示用户可以进入该目录,既可以使用"cd"命令
    我们不仅可以用rwx表示文件的权限,还可以同数字表示,具体如下:
  • r:4
  • w:2
  • x:1
    每种身份各自的三个权限(r、w、x)分数是需要累加的,例如当权限为[-rwxrwxr-x]分数则是:
    owner=rwx=4+2+1=7
    group=rwx=4+2+1=7
    others=r-x=4+1=5
    所以,该文件的权限数字就是 775。

总结

本文由一个线上问题,将自己的种种不足都暴露出来了。挺好的。

参考

补习系列(11)-springboot 文件上传原理

这篇关于我去,Excel文件导入失败都搞不定么----记一次Excel文件导入失败--is not valid的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/628712

相关文章

C#借助Spire.XLS for .NET实现在Excel中添加文档属性

《C#借助Spire.XLSfor.NET实现在Excel中添加文档属性》在日常的数据处理和项目管理中,Excel文档扮演着举足轻重的角色,本文将深入探讨如何在C#中借助强大的第三方库Spire.... 目录为什么需要程序化添加Excel文档属性使用Spire.XLS for .NET库实现文档属性管理Sp

C#实现将Excel工作表拆分为多个窗格

《C#实现将Excel工作表拆分为多个窗格》在日常工作中,我们经常需要处理包含大量数据的Excel文件,本文将深入探讨如何在C#中利用强大的Spire.XLSfor.NET自动化实现Excel工作表的... 目录为什么需要拆分 Excel 窗格借助 Spire.XLS for .NET 实现冻结窗格(Fro

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

使用Python实现高效复制Excel行列与单元格

《使用Python实现高效复制Excel行列与单元格》在日常办公自动化或数据处理场景中,复制Excel中的单元格、行、列是高频需求,下面我们就来看看如何使用FreeSpire.XLSforPython... 目录一、环境准备:安装Free Spire.XLS for python二、核心实战:复制 Exce

pandas批量拆分与合并Excel文件的实现示例

《pandas批量拆分与合并Excel文件的实现示例》本文介绍了Pandas中基于整数位置的iloc和基于标签的loc方法进行数据索引和切片的操作,并将大Excel文件拆分合并,具有一定的参考价值,感... 目录一、Pandas 进行索引和切编程片的iloc、loc方法二、Pandas批量拆分与合并Exce

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

Java轻松实现在Excel中插入、提取或删除文本框

《Java轻松实现在Excel中插入、提取或删除文本框》在日常的Java开发中,我们经常需要与Excel文件打交道,当涉及到Excel中的文本框时,许多开发者可能会感到棘手,下面我们就来看看如何使用J... 目录Java操作Excel文本框的实战指南1. 插入Excel文本框2. 提取Excel文本框内容3