request.getServletContext().getRealPath()获取路径总是临时文件夹解决方法

问题描述

最近在文件上传的过程中总是会遇见使用getServletContext().getRealPath()得到的是临时文件的路径。并且每次重启服务,这个临时文件的路径还会变更。

解决方法

  1. 配置module对应的work directory为当前的module目录:当idea中已有一个Project的情况下,再添加一个新Module的时候,Moduleworking directory可能默认还是Project的目录。

  2. 在工作区module目录下建立public文件夹。

原理

源码

我们可以看见SpringBoot启动后,默认会把commonDocRoot设置成这三个目录"src/main/webapp", "public", "static"

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package org.springframework.boot.web.servlet.server;

import java.io.File;
import java.net.JarURLConnection;
import java.net.URL;
import java.net.URLConnection;
import java.security.CodeSource;
import java.util.Arrays;
import java.util.Locale;
import org.apache.commons.logging.Log;

class DocumentRoot {
private static final String[] COMMON_DOC_ROOTS = new String[]{"src/main/webapp", "public", "static"};
private final Log logger;
private File directory;
//省略中间代码
private File getCommonDocumentRoot() {
String[] var1 = COMMON_DOC_ROOTS;
int var2 = var1.length;

for(int var3 = 0; var3 < var2; ++var3) {
String commonDocRoot = var1[var3];
File root = new File(commonDocRoot);
if (root.exists() && root.isDirectory()) {
return root.getAbsoluteFile();
}
}

return null;
}

}
  • 如果没有就会设置成临时位置。

  • 注意:这些目录都是在工作区下找的,如果没有设置工作区,肯定也是找不到的。

  • 配置好工作区,添加了public文件夹后,就能正常获取路径了。