2011-03-17 50 views
1

我有一个接受文件上传的servlet,我想将该文件存储在磁盘上的特定目录中。我正在使用码头。文件系统如下所示:Servlet - 将文件保存到磁盘,但不确定使用什么路径?

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

我从start.jar文件启动jetty。在servlet的背景下,我不知道如何将文件保存到我所期望的目的地,“/东西”文件夹:

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

呀 - 我不知道用什么路径 - 有我可以使用File类在java中打印当前工作目录的方式来计算出可能吗?

感谢

+0

如果你认为它不是特定于Jetty,这个问题是[从servlet内写入文件]的副本(http://stackoverflow.com/questions/4482353/writing-to-file-from-within- a-servletdeployertomcat) – rds 2013-02-28 09:53:59

回答

7

这是一个相当差的做法。不能保证它可以在Jetty以外的所有servlet容器上运行。即便如此,我不确定它是否可以在Jetty上运行。至少,tt会让你的webapp不适用于其他容器。

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

当以下行被称为在servlet里面foo.war

String absoluteFooWebPath = getServletContext().getRealPath("/"); 

和Jetty扩大WAR文件在同一个web应用文件夹,那么这将导致对/jetty/webapps/foo绝对路径。然后,从那里到/jetty/stuff,您需要导航两个目录,然后从那里导航stuff目录。

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

毕竟,最可靠的方法是指定您正确记录在你的web应用程序的安装手册,或使其configureable一些VM参数/系统的读/写权限的servletcontainer无关的固定路径属性。

+0

同意这是一个可怕的做法。 – user291701 2011-03-17 23:48:38

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

的startup.jar文件应设置jetty.home system property。使用​​访问它。

0

尽管getRealPath在Jetty中运行war文件时很可能会返回一个有效路径,但在将来切换到另一个应用程序服务器时可能会有所不同。

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