Tomcat临时目录及java.io.tmpdir对应的目录

最近客户现场的技术支持接连反馈了一个问题:导入数据的时候,上传的excel会在服务器上生成一个临时文件,而这个临时文件都在  tomcat 的安装目录下,若是上传次数比较多的话,就会致使tomcat安装目录下有多个临时的excel文件,很不合理也不美观,以下图:java

 

接到这个问题,第一反应是  java.io.tmpdir 这个系统配置没指定好,由于作上传的时候,是经过  linux

System.getProperty("java.io.tmpdir");

这种方式来获取临时目录,而后把文件放到临时目录里去的,按说这些临时文件都应该在 tomcat 安装目录下的 temp 文件夹里,由于这个是tomcat的临时目录,但如今却没有,因此怀疑是 java.io.tmpdir 这个系统变量没指定好。apache

以后就开始了各类查找资料,百度查完了查搜狗,搜狗查完了查Stack Overflow,但并无获得想要的答案,全部的文件都是告诉你临时文件目录在哪,固然也查到了若是去设置这个 java.io.tmpdir ,经过下面的方式:tomcat

  java -Djava.io.tmpdir=/path/to/tmpdir 服务器

但实际在linux服务器上执行的时候,发现这个命令根本没法执行,查了 Stack Overflow 才知道,这个命令后面还须要跟一个有 main 方法的Java类才行,但这显然是行不通的,也跟我想象中的设置java.io.temdir属性的方式不同,只能接着查资料。编辑器

查了半天,也没什么收获,问题始终没解决,最后,打印了一下程序执行时取到的  java.io.tmpdir 对应的目录,才知道问题在哪,代码以下:spa

先看一下打印结果:3d

能够看出来,程序运行时取到的  java.io.tmpdir 的值是彻底正确的,对应的就是tomcat安装目录下的 temp 文件夹日志

再看日志打印下面的代码,原来我在拼接文件完整路径的时候,在临时目录和文件名之间没有加  /  ,致使拼接出来的临时文件是这样的地址:excel

  /iflytek/apache-tomcat-9155/tempff9d68f1-9548-437f-a3e1-0ed93647392c_test.xlsx

也就是临时目录的 temp 和文件名连一块了,结果天然而然的就是,临时文件被上传到了 /iflytek/apache-tomcat-9155/  这个tomcat的安装目录下,致使了最开始的问题。

问题到这是解决了,但在查资料的过程当中,知道了不少新的知识。

 

在  tomcat 安装目录下的  bin/catalina.sh 这个命令里指定了 tomcat 的临时目录,而在程序中经过 

System.getProperty("java.io.tmpdir");

取系统的临时目录的时候,取的就是 tomcat 的临时目录,也就是 tomcat  安装目录下的 temp 文件夹。指定 java.io.tmpdir 对应目录的地方也是在 bin/catalina.sh 命令里。

首先,tomcat 启动的时候,虽然用的启动命令是  bin/startup.sh ,但这只是一个入口,启动的过程都是在 bin/catalina.sh 这个命令里,这个 catalina.sh 才是主要的命令,你甚至能够经过catalina.sh 这个命令启动 tomcat 。

那么,回归主题,tomcat 是如何指定它的临时目录的呢?

用文本编辑器打开 bin/catalina.sh 命令文件,上面是一大段注释,从注释中能够看到:

 

CATALINA_TMPDIR  这个对应的是tomcat的临时目录,而 JVM 的 java.io.tmpdir 使用的就是 CATALINA_TMPDIR 对应的目录。

接着往下翻能够看到:

 

CATALINA_TMPDIR  对应的是  "$CATALINA_BASE" 下的 temp 文件夹,而 "$CATALINA_BASE" 就是 tomcat 的安装目录,

也就是说在这里,指定了 tomcat 的临时目录是tomcat安装目录下的 temp 文件夹

 

 而 tomcat 又是如何指定 CATALINA_TMPDIR   做为 java.io.tmpdir 对应的目录的呢?

接着往下看,能够看到:

在执行的时候,经过 java -D 命令,指定了 JVM 的 java.io.tmpdir 系统属性的值为  CATALINA_TMPDIR   对应的值

能够看到,tomcat 在启动的时候就已经指定了 java.io.tmpdir 对应的属性值,而且指定的是它的临时目录,这样在程序中经过 java.io.tmpdir  获取临时目录的时候,取到的都是tomcat的临时目录地址

 

总结一下:

一、tomcat 的临时目录地址是在 bin/catalina.sh 命令里指定的,指定的默认值是  安装目录下的 temp 文件夹,固然也能够根据须要修改为本身想要设置的目录地址

二、以 tomcat 为容器的项目里,经过 System.getProperty("java.io.tmpdir")   取JVM的临时目录地址,取到的都是tomcat的临时目录,这是在tomcat启动时就指定的

三、拼接文件地址的时候,必定要注意目录之间的分隔符  /  ,没有分隔符 /  ,目录名就成了文件名的一部分

相关文章
相关标签/搜索