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

时间:2011-03-17 17:37:35

标签: java servlets jetty

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

/jetty
  /bin
  /contexts
  /stuff
  /webapps
    foo.war   // one web app
    grok.war  // another web app
  start.jar

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

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

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

由于

4 个答案:

答案 0 :(得分:7)

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

当扩展WAR时(如果和 ,那么将扩展WAR,那么它的servletcontainer特定),那么ServletContext#getRealPath()可用于转换webcontent - 绝对磁盘文件系统路径的相对路径。

foo.war

内的servlet中调用以下行时
String absoluteFooWebPath = getServletContext().getRealPath("/");

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

String absoluteStuffPath = getServletContext().getRealPath("../../stuff");

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

答案 1 :(得分:0)

您可以使用以下代码打印当前目录,父目录:

import java.io.File;
public class FileOperations {
public static void main (String args[]) {
 File dir1 = new File (".");
 File dir2 = new File ("..");
 try {
   System.out.println ("Current dir : " + dir1.getCanonicalPath());
   System.out.println ("Parent  dir : " + dir2.getCanonicalPath());
   }
 catch(Exception e) {
   e.printStackTrace();
   }
 }
}

答案 2 :(得分:0)

startup.jar应该设置jetty.home system property。使用System.getProperty("jetty.home")访问它。

答案 3 :(得分:0)

虽然在Jetty中运行war文件时getRealPath可能会返回有效路径,但在将来切换到其他应用服务器时可能会有所不同。

最好在web.xml中将其设置为可配置选项,例如使用init-param,它只包含服务器上某个预先存在的文件夹的绝对路径。将它放在web.xml中可以在使用JBoss时更改它。您可以使用getInitParameter上的ServletConfig来获取值。