java - 如何通过 Java EE Web 应用程序将文件存储在服务器(Web 容器)上?

标签 java tomcat servlets jakarta-ee file-storage

我开发了一个 Java EE 网络应用程序。此应用程序允许用户在浏览器的帮助下上传文件。一旦用户上传了他的文件,此应用程序首先将上传的文件存储在服务器上(它正在运行),然后对其进行处理。

目前我在服务器上存储的文件如下:

try {
    // formFile represents the uploaded file
    FormFile formFile = programForm.getTheFile();
    String path = getServlet().getServletContext().getRealPath("") + "/"
        + formFile.getFileName();
    System.out.println(path);
    file = new File(path);
    outputStream = new FileOutputStream(file);
    outputStream.write(formFile.getFileData());
}

其中,formFile 代表上传的文件。

现在,问题是它在某些服务器上运行良好,但在某些服务器上 getServlet().getServletContext().getRealPath("") 返回 null 所以我得到的最终路径是 null/filename 并且文件没有存储在服务器上。

当我检查 ServletContext.getRealPath() 的 API 时方法,我发现了以下内容:

public java.lang.String getRealPath(java.lang.String path)

Returns a String containing the real path for a given virtual path. For example, the path "/index.html" returns the absolute file path on the server's filesystem would be served by a request for "http://host/contextPath/index.html", where contextPath is the context path of this ServletContext.

The real path returned will be in a form appropriate to the computer and operating system on which the servlet container is running, including the proper path separators. This method returns null if the servlet container cannot translate the virtual path to a real path for any reason (such as when the content is being made available from a .war archive).

那么,有没有其他方法可以让我在那些服务器上存储文件,这些服务器也为 getServlet().getServletContext().getRealPath("")null

最佳答案

根据规范,保证从 servlet 容器获得的唯一“真实”路径是临时目录。

您可以通过 ServletContext.gerAttribute("javax.servlet.context.tempdir") 获取它。但是,这些文件对 Web 上下文不可见(即您不能发布简单的 URL 来传送这些文件),并且不能以任何方式保证这些文件在 Web 应用程序或服务器重启后仍然存在。

如果您只是需要一个地方来短期存储工作文件,那么这很适合您。

如果你真的需要一个目录,你可以把它作为一个配置参数(一个环境变量,一个 Java 属性(即 java -Dyour.file.here=/tmp/files ... )、web.xml 中设置的上下文参数、通过 Web 表单存储在数据库中的配置参数等)。然后由部署人员为您设置此目录。

但是,如果您稍后需要实际提供该文件,您将需要一个特定于容器的机制来将外部目录“挂载”到您的网络应用程序中(Glassfish 作为“备用文档根目录”,其他人也有类似的概念),或者您将需要编写一个 servlet/过滤器来在您的网络应用程序之外提供文件存储。这FileServlet非常完整,正如您所见,创建自己的内容虽然不难,但要正确完成也并非易事。

编辑:

基本要点是相同的,但不是使用“getRealPath”,而是简单地使用“getInitParameter”。

所以:

String filePath = getServletContext().getInitParameter("storedFilePath") + "/" + fileName;

继续前进。

再次编辑:

至于路径的内容,我给它一个绝对路径。否则,您需要知道应用服务器在执行期间将其默认路径设置到何处,并且每个应用服务器可能使用不同的目录。例如,我认为 Glassfish 的工作目录是运行域的配置目录。不是一个特别明显的选择。

因此,绝对使用绝对路径。这样您就知道文件的去向,并且如果有必要,您可以在操作系统级别控制该目录的访问权限。

关于java - 如何通过 Java EE Web 应用程序将文件存储在服务器(Web 容器)上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2663204/

相关文章:

tomcat - Log4J 在 war 部署时抛出一个 stackoverflow 错误

java - Apache Tomcat 错误 http 状态 404

Java项目Ant构建错误

java - Cassandra 一致性级别规则

java - 在 tomcat 生产服务器上编辑代码时如何以及何时清理和重新启动

java - 错误 : HTTP Status 500 - org. apache.jasper.JasperException,根本原因 : java. util.NoSuchElementException

java - 单击按钮时,在 JSP 上显示 'Please wait' 警报。当 servlet 上的处理完成时,删除警报

java - 小程序请求不延长 session 实时

java - Lanterna SwingTerminal 不会显示

java - 使用 HtmlCleaner 和 AsyncTask 清理 HTML