Servlets JavaEE—获取上传文件的真实路径的最佳方法?

Servlets JavaEE—获取上传文件的真实路径的最佳方法?,servlets,file-upload,save,Servlets,File Upload,Save,我有一个带有上传表单的web应用程序,用户可以在其中上传文件 我想将这些文件存储在“文件”文件夹中。我想把这个文件夹直接放在webapp根目录下 使用struts2,在我的uploadFileAction中,我可以使用字符串uploadDir=ServletActionContext.getServletContext().getRealPath(“/files”)+“/”轻松设置此路径 但是当我试图检索文件时,显然我的bean试图访问文件,但它无权访问getServletContext(),因

我有一个带有上传表单的web应用程序,用户可以在其中上传文件

我想将这些文件存储在“文件”文件夹中。我想把这个文件夹直接放在webapp根目录下

使用struts2,在我的uploadFileAction中,我可以使用
字符串uploadDir=ServletActionContext.getServletContext().getRealPath(“/files”)+“/”轻松设置此路径

但是当我试图检索文件时,显然我的bean试图访问文件,但它无权访问
getServletContext()
,因此在
getRealPath

现在我在想我该怎么做。我听说SpringResource是一个不错的选择,但是我找不到任何相关的例子

有没有一个简单的方法来获取我的路径?我只想要我的webapp的根路径。不多不少

我希望此文件夹直接放在webapp根目录下

这是行不通的。无论何时重新部署webapp,甚至重新启动服务器,所有这些文件都将丢失。这些文件并不是最初战争的一部分


您需要将它们存储在webapp上下文之外的固定路径中。例如,
/var/webapp/uploads
。您可以在属性文件中配置此路径,也可以将其配置为系统属性。

我发现,无论您使用的是什么操作系统平台,都有几种方法可以实现这一点。我通常喜欢以与web应用程序相关的方式存储文件。也就是说,最简单的方法是使用类文件作为引用来获取实际路径。我使用类似于以下内容的内容来存储我构建的一些web应用程序的图像上传:

public class FileLocationTest {

    public static void main(String[] args) {
        String path = FileLocationTest.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        System.out.println(path);
    }
}
这可以通过使用web应用程序中的静态实用程序类来实现,也可以使用任何此类来获取应用程序的实际路径,而不考虑操作系统。或者,在servlet中,如果我的appbase位于不同的区域,我还使用request类来获取Tomcat位置,如下所示:

    String location = request.getClass().getProtectionDomain().getClassLoader().getClass().getProtectionDomain().getCodeSource().getLocation().getPath();
    String path = location.substring(0, location.indexOf("/tomcat")) + "/data/events/images/";

哇!我没有想到这一点。谢谢你指出我明显的错误。但是当我在不同平台(linux windows)之间移动时,我需要一个上传目录的相对路径。我不喜欢每次跳转平台时都编辑属性文件…在Java
文件
API中,类似Unix的路径,如
/var/webapp/uploads
在Windows中也能很好地工作。它只是相对于从中执行代码的磁盘,Java将关注斜杠。例如,当服务器在
C:
上运行时,它最终将成为
C:\var\webapp\uploads
。感谢您清除这一点。请原谅我是一个unix新手,但我仍然有点不确定如何指定路径,因为我的unix服务器是一个共享主机,我想我只能访问~目录,我需要将文件放在该目录下的某个位置。。任何指点都会有很大的帮助!你可以创建一个文件夹吗?请注意,这需要具有r/w访问权限。我的意思是,如何指定到这样一个目录的实际路径,如~。但我想我明白了。它的实际路径是/home/*username*/