我有一个接受文件上传的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中打印当前的工作目录来解决这个问题?
由于
答案 0 :(得分:7)
这是一个非常糟糕的做法。不能保证它适用于除Jetty之外的所有servlet容器。即便如此,我也不确定它是否适用于Jetty。至少,tt会使你的webapp无法移植到其他容器。
当扩展WAR时(如果和 ,那么将扩展WAR,那么它的servletcontainer特定),那么ServletContext#getRealPath()
可用于转换webcontent - 绝对磁盘文件系统路径的相对路径。
在foo.war
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
来获取值。