使用Java和JSP将文件上传到服务器目录 - 路径不正确

3

在我的虚拟专用服务器上,我想要将一个文件上传到Logos目录。 目录结构如下 -
/home/webadmin/domain.com/html/Logos

当通过我的jsp页面上传文件时,该文件会被重命名,然后我想将其放入Logos目录中...但是我似乎无法在我的servlet代码中正确设置路径。

servlet代码片段 -

String upload_directory="/Logos/"; // path to the upload folder

File savedFile = new File(upload_directory,BusinessName+"_Logo."+fileExtension);

//.....
//file saved to directory
//.....

我尝试了很多变化,但仍然失败。指定路径的正确方法是什么? 编辑
使用getServletContext()的问题在于它返回Tomcat和我的webapp所在目录的路径……而我想要到达html和图像文件所在的目录——在vps的根目录下。我该如何指定该路径?
    String server_path = getServletContext().getRealPath("/"); // get server path.                      

    //server_path = /opt/tomcat6/webapps/domain.com/

    String upload_directory = "Logos/"; // get path to the upload folder.

    String complete_path = server_path + upload_directory; // get the complete path to the upload folder.

    //complete_path = /opt/tomcat6/webapps/domain.com/Logos/

    File savedFile = new File(complete_path,"NewLogo.jpg");

    //savedFile = /opt/tomcat6/webapps/domain.com/Logos/NewLogo.jpg 
4个回答

3

通常情况下,将存储路径设置为可配置的是一种常见做法 - 可以通过一些 application.properties 文件进行配置,或者如果您没有这样的属性文件,则可以将其配置为 web.xml 中的 context-param。在那里,您可以将路径配置为绝对路径,例如:

configuredUploadDir=/home/webadmin/domain.com/html/Logos

获取您代码中的该值(取决于您如何存储它),并执行以下操作:
File uploadDir = new File(configuredUploadDir);

注意:确保您拥有读写目标目录的权限。


1
我将<context-param>放在主web.xml文件中,并指定了文件夹路径。然后在servlet中调用参数,如下所示--(FileUploadPath = getServletContext().getInitParameter("FileUploadPath");)--但不幸的是,它仍然没有将图片放在该文件夹位置。我不明白为什么... - katura
@katura - 调试(或将参数打印到控制台)的值。 - Bozho
@Bozho - 参数的值打印出来了 - /home/webadmin/domain.com/html/Logos - katura
1
@katura - 好的。那么,有任何异常吗?你可以检查一下你是否拥有写入权限吗?这个目录存在吗?(file.exists() 返回什么?) - Bozho
检查了Tomcat日志,所有信息都很好。目录已经存在,我在服务器上创建了它。事实上,在你的最后一条评论中提到的一个关键词是解决这个问题的答案...现在我感到非常愚蠢... 'permissions' - 我需要设置文件夹的写入权限,以便从'Owner','Group'和'Other'进行写入。非常感谢您帮助我解决这个问题。我还喜欢将文件夹路径作为< context-param>放入web.xml文件中的建议。非常感谢您!由于评论包含答案,我应该将您的回答标记为正确吗? - katura
@katura - 是的,随意将其标记为已接受。我也会在答案中添加权限事项。 - Bozho

2
您可以在任何jsp或servlet中使用以下代码。
1) String serverPath= getServletContext().getRealPath("/");
这将为您提供从根目录到您的Web应用程序目录的服务器完整路径。 对于我来说,当我从myapp应用程序进行sysout时,它是:"D:\local\tomcat-6.0.29\webapps\myapp"。
一旦您获得了上述服务器系统的全部实际路径,您就可以获得相对于您的目录的路径。因此,如果我在myapp\data中有一些数据文件,我可以将\data\filename附加到我们之前获取的serverPath中。 即使您在同一系统上安装了多个服务器,这也适用于所有情况。
2) 您可以使用系统属性从system properties中获取服务器主目录
System.getProperty("TOMCAT_HOME")
然后可以在程序中使用该绝对路径。
3) 要将绝对目录路径传递给任何servlet,请使用 希望这适用于您。

1
问题在于:File构造函数不会创建文件,只是为创建做准备。因此,在构造文件实例后,您必须调用createNewFile()方法来创建文件。就这样。

0

路径"/Logos/"将尝试在您系统的根目录中创建文件,这不是您想要的。请查看ServletContext.getRealPath()方法。


我已经在我的原始帖子中添加了有关使用ServletContext.getRealPath的其他信息 - 这并没有给我想要的结果。 - katura
你的HTML和图像文件不在与JSP文件相同的目录中?那应该是它们的正常位置。但在你的情况下,只需将upload_directory设置为“html/Logos/”即可解决问题。 - Eric Giguere
那是正确的,Html和Image文件不在与Jsp页面相同的目录中。我会尝试您的建议,如果不起作用,我想我只能将图像文件放在jsp页面中。 - katura

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接