java后台的“/”相对路径不是代表webroot吗,为什么在这里代表了d盘,测试的文件都传到了d盘呀?
@RequestMapping(value = "/upload_img",method = {RequestMethod.GET, RequestMethod.POST},produces = "application/json; charset=utf-8") @ResponseBody
public String upload_img(MultipartFile file,HttpServletRequest request) throws Exception{
String path="/upload/news";
//创建文件
File dir=new File(path);
if(!dir.exists()){
dir.mkdirs();
}
String id = SysUtil.getUUID();
String fileName=file.getOriginalFilename();
String img=id+fileName.substring(fileName.lastIndexOf("."));//zhao.jpg
FileOutputStream imgOut=new FileOutputStream(new File(dir,img));//根据 dir 抽象路径名和 img 路径名字符串创建一个新 File 实例。
imgOut.write(file.getBytes());//返回一个字节数组文件的内容
imgOut.close();
Map<String, String> map=new HashMap<String, String>();
map.put("path",img);
return JSON.toJSONString(map);
}
回答:
经过测试:
new File(""); // 返回当前项目路径new File("test.txt"); // 返回当前项目路径加上给定文件名
new File("/test.txt"); // 返回 `JVM` 实例所在盘符加上给定文件名
在 File.java
里可以看到其构造方法的源码:
// File.java public File(String pathname) {
if (pathname == null) {
throw new NullPointerException();
}
this.path = fs.normalize(pathname);
this.prefixLength = fs.prefixLength(this.path);
}
其中 path
就是影响到结果的地方,fs
在 Windows
下是一个 WinNTFileSystem
的实例,其 normalize
方法的源码如下:
/* Check that the given pathname is normal. If not, invoke the real normalizer on the part of the pathname that requires normalization.
This way we iterate through the whole pathname string only once. */
@Override
public String normalize(String path) {
int n = path.length();
char slash = this.slash;
char altSlash = this.altSlash;
char prev = 0;
for (int i = 0; i < n; i++) {
char c = path.charAt(i);
if (c == altSlash)
return normalize(path, n, (prev == slash) ? i - 1 : i);
if ((c == slash) && (prev == slash) && (i > 1))
return normalize(path, n, i - 1);
if ((c == ':') && (i > 1))
return normalize(path, n, 0);
prev = c;
}
if (prev == slash) return normalize(path, n, n - 1);
return path;
}
具体为什么 /
会导致结果的不同,现在我没时间追下去,有兴趣你可以自行看一下,这个文件在 java.io.WinNTFileSystem
那你就检查 Tomcat
(或者其他 Server
) 的配置文件看一下 webroot
指向了哪里
回答:
/
代表webroot
是Web Server容器对某些操作的约定,比如forward
方法等。但是在纯Java中,也就是直接调用JDK的时候,/
所表示的仍然是当前盘符的根,而不是webroot
。
这种情况一般都使用相对路径来做,不要用绝对路径。
以上是 java后台的“/”相对路径不是代表webroot吗,为什么在这里代表了d盘,测试的文件都传到了d盘呀? 的全部内容, 来源链接: utcz.com/p/174348.html