Servlet - 将文件保存到磁盘,但不确定使用哪个路径?

use*_*701 1 java servlets jetty

我有一个接受文件上传的servlet,我想将文件存储在磁盘上的特定目录中.我正在使用码头.文件系统如下所示:

/jetty
  /bin
  /contexts
  /stuff
  /webapps
    foo.war   // one web app
    grok.war  // another web app
  start.jar
Run Code Online (Sandbox Code Playgroud)

我从start.jar文件启动jetty.在servlet的上下文中,我不确定如何将文件保存到我想要的目标,即"/ stuff"文件夹:

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
    throws ServletException, IOException 
{
    File downloaded = new File("some/path/here/stuff"); // ?
}
Run Code Online (Sandbox Code Playgroud)

是的 - 我不确定使用什么路径 - 有没有办法我可以使用File类在java中打印当前的工作目录来解决这个问题?

谢谢

Bal*_*usC 7

这是一个非常糟糕的做法.不能保证它适用于除Jetty之外的所有servlet容器.即便如此,我也不确定它是否适用于Jetty.至少,tt会使您的webapp无法移植到其他容器.

当战争扩大(它的servletcontainer具体的,如果这里的战争将扩大!),那么ServletContext#getRealPath()可以使用一个web内容相对路径转换为绝对磁盘文件系统的路径.

当在servlet里面调用以下行时 foo.war

String absoluteFooWebPath = getServletContext().getRealPath("/");
Run Code Online (Sandbox Code Playgroud)

并且Jetty已将WAR文件扩展到相同的webapps文件夹中,然后这将导致绝对路径/jetty/webapps/foo.然后,要从那里到达/jetty/stuff,您需要向上导航两个目录,然后从那里导航stuff目录.

String absoluteStuffPath = getServletContext().getRealPath("../../stuff");
Run Code Online (Sandbox Code Playgroud)

毕竟,最可靠的方法是指定一个具有读/写权限的独立于servlet容器的固定路径,您可以在webapp的安装手册中正确记录这些权限,或者使其可以通过某些VM参数/系统属性进行配置.