tomcat 将我的文件存储在哪里?

问题描述 投票:0回答:3

我使用 Netbeans 创建了一个 Web 应用程序。之前,当我通过 netbeans 和 tomcat 服务器(这是一个 zip)运行 Web 应用程序时,我的所有外部文件(上传的文件和我用于应用程序的其他帮助文件)都存储在

bin
目录中。

现在,我尝试使用Windows安装程序安装apache tomcat服务,因为我想知道如何将项目部署在专用服务器上。我已经使用 tomcat 的部署实用程序成功部署了 war 文件。但是,当我通过 apache tomcat windows 服务运行该项目时,它不会将文件保存在

bin
目录中,并且也无法读取我粘贴在
bin
目录中的文件。

您认为我应该将文件放在哪里?

编辑:通过观察tomcat服务目录,我发现它存储在根目录中。如果我的 tomcat 安装在“E:\Apache\services omcat\”,它存储在“tomcat”目录中。

java apache tomcat netbeans
3个回答
7
投票

最终,您的应用程序的行为决定了文件的存储位置。

听起来,您的应用程序将文件存储在 JVM 的当前目录中,当您通过 NetBeans 启动 Web 服务器时,该目录恰好是“bin”目录。如果是这样,当 Tomcat 作为 Windows 服务启动时,您将在当前目录中找到它们。

坦白说,我认为你错了。您应该有意识地决定应该存储上传的文件,然后确保您使用的上传机制将它们放在那里。

显然,将它们放在当前目录中是一个坏主意。您不希望它们根据 Web 容器的启动方式存储在不同的位置。显然“bin”目录是一个不合适的地方。 (如果用户尝试上传名称与“bin”中的脚本之一匹配的文件,会发生什么?)


那么您应该将文件放在哪里?

在我看来,你有三个选择:

  • work
    目录的子目录中...这是 Tomcat 通常放置临时文件(例如已编译的 JSP)的位置。

  • Tomcat安装目录的自定义子目录中。

  • 在文件系统中其他位置的单独目录中。

您不应该将其放在 webapp 目录中,因为重新部署 webapp 时,那里的文件通常会被删除,而且上传的文件干扰您的 webapp 的风险更大。

您不应该将它们放在 bin 或 log 或 lib 或 config 目录中,因为存在干扰的风险......并且因为它们根本不符合逻辑。


如果你想写相对于tomcat安装目录根目录的文件,你可以通过调用

System.getProperty("catalina.base")
来了解那是什么。

但是无论你做什么,你都需要确保用户不会意外或故意地将文件上传到错误的位置;例如,通过提供绝对路径名,或使用“../../....”的路径名来逃离您的上传区域。


3
投票

安装 Apache 时,该项目应该位于 webapp 文件夹中:

C:\Apache\tomcat\webapps

就像我的项目是 gaganisonline 所以目录结构是这样的:

路径:

C:\Apache\tomcat\webapps\gaganisonline

                            gaganisonline
                            |           |
                         WEB-INF      index.html
                            |
              ---------------------------
              |         |      |        |
            web.xml    src    lib    classes

0
投票

好吧,如果你问我,我用这个解决了我自己的解决方案

private final StorageProperties storageProperties;
private Path rootLocation;

@Override
public void init() {
    try {
        String userHome = System.getProperty("user.home");

        Path targetFolder = Paths.get(userHome, storageProperties.getLocation());
        Files.createDirectories(targetFolder);

        this.rootLocation = targetFolder;
        System.out.println("Initialized storage with root location: " + rootLocation);
    } catch (IOException e) {
        throw new StorageException("Could not create folder", e);
    }
}

它从 StorageProperties 类中获取我的文件夹名称,然后在视频、照片和其他内容旁边创建一个文件夹 (C:\Users%USERNAME%) 以方便访问,并且它不会将任何文件保存到无处可去的 war 中无论哪种方式都可以找到,所以我认为它可能是 AppData 或其他东西,这听起来很烦人和混乱。

© www.soinside.com 2019 - 2024. All rights reserved.