一尘不染

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

tomcat

我已经开发了Java EE
Web应用程序。该应用程序允许用户在浏览器的帮助下上传文件。用户上载文件后,此应用程序首先将上载的文件存储在运行该文件的服务器上,然后对其进行处理。

目前,我将文件存储在服务器上,如下所示:

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,文件未存储在服务器上。

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

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

返回一个字符串,其中包含给定虚拟路径的真实路径。例如,该路径"/index.html"返回服务器文件系统上的绝对文件路径,该路径将由对的请求提供服务"http://host/contextPath/index.html",其中contextPath是此ServletContext的上下文路径。

返回的实际路径将采用适合运行servlet容器的计算机和操作系统的形式,包括适当的路径分隔符。如果servlet容器由于某种原因(例如,当从.war归档中提供内容时)无法将虚拟路径转换为真实路径,则此方法返回null。

那么,有没有用,我可以存储这些服务器也被返回的文件任何其他方式null进行getServlet().getServletContext().getRealPath("")


阅读 330

收藏
2020-06-16

共1个答案

一尘不染

确实不建议从Java EE容器写入文件系统,尤其是在需要处理写入的数据时:

  • 它不是事务性的
  • 它损害了可移植性(如果您在集群环境中,该怎么办)
  • 它需要为目标位置设置外部参数

如果可以选择的话,我会将文件存储在数据库中或使用JCR存储库(如Jackrabbit)。

2020-06-16