【问题标题】:How to provide relative path in File class to upload any file? [duplicate]如何在 File 类中提供相对路径来上传任何文件? [复制]
【发布时间】:2011-08-28 21:40:18
【问题描述】:

我正在上传一个文件,我想为其提供一个相对路径,因为该程序应该可以在 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());

【问题讨论】:

    标签: java servlets file-upload


    【解决方案1】:

    我想提供一个相对路径

    永远不要在 web 应用程序中这样做。工作目录无法从代码内部控制。


    因为程序应该可以在 linux 和 windows 环境中运行。

    只需使用"/path/to/uploaded/files"。它在两种环境中都同样有效。在 Windows 中,它只会是与服务器运行的磁盘相同的磁盘。

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

    这是我用来上传的

     realPath = getServletContext().getRealPath(/files);
     destinationDir = new File(realPath);
    

    您不应将文件存储在网络内容中。当 WAR 未展开时,这将失败,即使在展开 WAR 时,只要重新部署 WAR,所有文件都会丢失。将它们存储在 WAR 之外的绝对位置,例如/path/to/uploaded/files 如前所述。

    另见:

    【讨论】:

    • @BalusC:所以我应该用/files 替换destinationDir,它应该可以工作吗?
    • 是的,在 linux 中是 /files,在 Windows 中是 C:\files(假设服务器在 C: 上运行)。
    • 我还需要getServletContext().getRealPath(/files);吗?在这种情况下?
    • 不,绝对不是。每当您重新部署 WAR 时,这些文件都会丢失。使用固定路径。另请参阅我的答案中的“另请参阅”链接。
    • 我认为你误解了,我不是在检查 windows 或 linux 框,如果我只是将 destinationDir 替换为 /files 它将适用于这两个平台吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-23
      • 1970-01-01
      • 2013-05-11
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2014-12-29
      • 1970-01-01
      相关资源
      最近更新 更多