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 就是影响到结果的地方,fsWindows 下是一个 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

回到顶部