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

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

前言

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

说明

本项目用的是 SpringBoot 2.x

问题重现

org.springframework.web.multipart.MultipartException: Failed to parse multipart servlet

我的脑门多了许多黑人问号??/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指定,默认值为;

操作系统 路径
windows C:\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:
    #开启swagger
    enabled: true
    #最大上传文件大小
    max-file-size: 5MB
    #临时文件夹
    location: /srv/www/extend

或者使用配置类,如下:

@Configuration
    public static class FileConfig {
        @Bean
    public 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-x 3 test test 4096 6月 11 15:06 work

用户权限

连接数

所有者 用户组 文件大小 修改日期 文件夹名

文件类型与权限

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 文件上传原理


目录
打赏
0
相关文章
【全自动改PDF名】批量OCR识别提取PDF自定义指定区域内容保存到 Excel 以及根据PDF文件内容的标题来批量重命名
学校和教育机构常需处理成绩单、报名表等PDF文件。通过OCR技术,可自动提取学生信息并录入Excel,便于统计分析和存档管理。本文介绍使用阿里云服务实现批量OCR识别、内容提取、重命名及导出表格的完整步骤,包括开通相关服务、编写代码、部署函数计算和设置自动化触发器等。提供Python示例代码和详细操作指南,帮助用户高效处理PDF文件。 链接: - 百度网盘:[链接](https://pan.baidu.com/s/1mWsg7mDZq2pZ8xdKzdn5Hg?pwd=8866) - 腾讯网盘:[链接](https://share.weiyun.com/a77jklXK)
54 5
【图片型PDF】批量识别扫描件PDF指定区域局部位置内容,将识别内容导出Excel表格或批量改名文件,基于阿里云OCR对图片型PDF识别改名案例实现
在医疗和政务等领域,图片型PDF文件(如病历、报告、公文扫描件)的处理需求广泛。通过OCR技术识别这些文件中的文字信息,提取关键内容并保存为表格,极大提高了信息管理和利用效率。本文介绍一款工具——咕嘎批量OCR系统,帮助用户快速处理图片型PDF文件,支持区域识别、内容提取、导出表格及批量改名等功能。下载工具后,按步骤选择处理模式、进行区域采样、批量处理文件,几分钟内即可高效完成数百个文件的处理。
132 8
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
370 9
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
招行面试:100万级别数据的Excel,如何秒级导入到数据库?
本文由40岁老架构师尼恩撰写,分享了应对招商银行Java后端面试绝命12题的经验。文章详细介绍了如何通过系统化准备,在面试中展示强大的技术实力。针对百万级数据的Excel导入难题,尼恩推荐使用阿里巴巴开源的EasyExcel框架,并结合高性能分片读取、Disruptor队列缓冲和高并发批量写入的架构方案,实现高效的数据处理。此外,文章还提供了完整的代码示例和配置说明,帮助读者快速掌握相关技能。建议读者参考《尼恩Java面试宝典PDF》进行系统化刷题,提升面试竞争力。关注公众号【技术自由圈】可获取更多技术资源和指导。
|
3月前
|
批量将不同的工作簿合并到同一个Excel文件
本文介绍如何使用Python的`pandas`库批量合并不同工作簿至同一Excel文件。通过模拟生成三个班级的成绩数据,分别保存为Excel文件,再将这些文件合并成一个包含所有班级成绩的总成绩单。步骤包括安装必要库、生成数据、保存与合并工作簿。
84 6
|
3月前
|
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分为多个工作表。本文通过一个具体示例,展示了如何根据学生班级将成绩数据拆分到不同的工作表中,并生成一个包含总成绩表和各班级成绩表的Excel文件。代码简洁明了,适合初学者学习和应用。
73 6
|
3月前
|
按条件将Excel文件拆分到不同的工作表
使用Python的pandas库,可以轻松将Excel文件按条件拆分到不同的工作表中。本文通过一个示例代码展示了如何生成一个包含总成绩表和三个班级表的Excel文件。代码首先创建了一个包含学生姓名、班级和各科成绩的数据框,然后按班级分组,将每个班级的数据分别写入不同的工作表。最后,生成的Excel文件将包含四个工作表,分别为总成绩表和三个班级的成绩表。
58 6
按条件将Excel文件拆分到不同的工作表
|
4月前
|
实现Excel文件和其他文件导出为压缩包,并导入
实现Excel文件和其他文件导出为压缩包,并导入
61 1
|
4月前
|
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
241 4
Vue导出el-table表格为Excel文件的两种方式
Vue导出el-table表格为Excel文件的两种方式
263 6

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等