Java 如何在文件类中提供上传任何文件的相对路径?

Java 如何在文件类中提供上传任何文件的相对路径?,java,servlets,file-upload,Java,Servlets,File Upload,我正在上传一个文件,我想为其提供一个相对路径,因为该程序应该在linux和windows环境中都能工作 这是我用来上传的 realPath = getServletContext().getRealPath(/files); destinationDir = new File(realPath); if(!item.isFormField()) { File file = new File(destinationDir,it

我正在上传一个文件,我想为其提供一个相对路径,因为该程序应该在linux和windows环境中都能工作

这是我用来上传的

realPath = getServletContext().getRealPath(/files);
destinationDir = new File(realPath);
if(!item.isFormField())
                {
                    File file = new File(destinationDir,item.getName());

                    item.write(file);
}
此处直接提供相对路径的任何其他方式

File file = new File(destinationDir,item.getName());
我想提供一个相对路径

千万不要在网络应用程序中这样做。无法从代码内部控制工作目录


因为这个程序应该在linux和windows环境下都能工作

只需使用
“/path/to/upload/files”
。它在两种环境中都能正常工作。在Windows中,它将仅与服务器运行的磁盘相同

File file = new File("/path/to/uploaded/files", filename);
// ...

这是我用来上传的

realPath = getServletContext().getRealPath(/files);
destinationDir = new File(realPath);
if(!item.isFormField())
                {
                    File file = new File(destinationDir,item.getName());

                    item.write(file);
}
您不应将文件存储在webcontent中。当战争未展开时,此操作将失败,即使战争已展开,只要重新部署战争,所有文件都将丢失。将它们存储在战争之外的绝对位置,如前面建议的
/path/to/upload/files

另见:

    • 正如BalusC指出的,您不想将文件保存到使用getRealPath找到的目标。当你重新部署时,这些文件不仅会被删除,而且任何可以访问你网站的用户都可以下载这些文件,这可能是一个严重的安全问题,具体取决于你在做什么


      当我遇到这个问题时,我通常会创建一个属性文件,并将保存文件的目录放在属性文件中。然后,我可以为Linux和Windows,或服务器a和服务器B创建一个不同的路径。您只需创建一个路径并对其进行硬编码就可以了,但我经常发现,在不同的服务器上需要不同的路径。比如,在我目前的项目中,我们有三个Tomcat实例在同一个物理盒上运行,用于不同的测试阶段。我们不希望他们写入的文件都进入同一个目录:每个目录都应该有自己的。

      @BalusC:所以我将用
      /files
      替换
      /destinationDir
      ,它应该可以工作吗?是的,在linux中是
      /files
      ,在Windows中是
      C:\files
      (假设服务器运行在C:),我还需要
      getServletContext().getRealPath(/files)?在这种情况下?不,绝对不是。只要你重新部署战争,这些文件就会丢失。使用固定路径。另请参阅我回答中的“请参阅”链接。我想您误解了,我没有检查windows或linux box,如果我简单地用
      /files
      替换
      /destinationDir
      ,它对这两种平台都有效吗?