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

Java Servlet-将文件保存到磁盘,但不确定使用什么路径?,java,servlets,jetty,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 voi

我有一个接受文件上传的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中当前的工作目录来解决这个问题


谢谢

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

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();
   }
 }
}

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

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();
   }
 }
}

startup.jar应该设置jetty.home。使用System.getPropertyjetty.home访问它。

startup.jar应该设置jetty.home。使用System.getPropertyjetty.home访问它。

这是一个非常糟糕的做法。不能保证它能在除Jetty之外的所有servletcontainers上工作。即使这样,我也不确定它在码头上是否有效。至少,tt会使您的webapp无法移植到其他容器

当战争扩大时,它是特定于servletcontainer的,如果战争扩大,以及战争将扩大到哪里!,然后,可以使用ServletContextgetRealPath将webcontent相对路径转换为绝对磁盘文件系统路径

在foo.war内的servlet中调用以下行时

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

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

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

这是一个非常糟糕的做法。不能保证它能在除Jetty之外的所有servletcontainers上工作。即使这样,我也不确定它在码头上是否有效。至少,tt会使您的webapp无法移植到其他容器

当战争扩大时,它是特定于servletcontainer的,如果战争扩大,以及战争将扩大到哪里!,然后,可以使用ServletContextgetRealPath将webcontent相对路径转换为绝对磁盘文件系统路径

在foo.war内的servlet中调用以下行时

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

String absoluteStuffPath = getServletContext().getRealPath("../../stuff");
毕竟,最可靠的方法是指定一个独立于servletcontainer且具有读/写权限的固定路径,您可以在webapp的安装手册中正确记录该路径,或者通过一些VM参数/系统属性对其进行配置。

尽管getRealPath在Jetty中运行war文件时可能会返回有效路径,当您将来切换到不同的应用程序服务器时,情况可能会有所不同

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

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


最好在web.xml中将其设置为可配置选项,例如使用init param,它只包含指向服务器上某个预先存在的文件夹的绝对路径。将它放在web.xml中允许在使用JBoss实例时实时更改它。你可以在ServelCoufg上使用GETIN参数来获得这个值。

同意这是一个可怕的做法。同意这是一个可怕的做法。如果你认为这不是Jetty的特例,这个问题是一个重复的问题。如果你认为这不是针对Jetty的,这个问题是一个复制品。