我已经开发了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代表上传的文件。
formFile
现在,问题在于它在某些服务器上运行良好,但在某些服务器getServlet().getServletContext().getRealPath("")上返回,null因此我得到的最终路径是null/filename,文件未存储在服务器上。
getServlet().getServletContext().getRealPath("")
null
null/filename
当我检查API的ServletContext.getRealPath()方法时,发现以下内容:
ServletContext.getRealPath()
public java.lang.String getRealPath(java.lang.String path) 返回一个字符串,其中包含给定虚拟路径的真实路径。例如,该路径"/index.html"返回服务器文件系统上的绝对文件路径,该路径将由对的请求提供服务"http://host/contextPath/index.html",其中contextPath是此ServletContext的上下文路径。 返回的实际路径将采用适合运行servlet容器的计算机和操作系统的形式,包括适当的路径分隔符。如果servlet容器由于某种原因(例如,当从.war归档中提供内容时)无法将虚拟路径转换为真实路径,则此方法返回null。
public java.lang.String getRealPath(java.lang.String path)
返回一个字符串,其中包含给定虚拟路径的真实路径。例如,该路径"/index.html"返回服务器文件系统上的绝对文件路径,该路径将由对的请求提供服务"http://host/contextPath/index.html",其中contextPath是此ServletContext的上下文路径。
"/index.html"
"http://host/contextPath/index.html"
返回的实际路径将采用适合运行servlet容器的计算机和操作系统的形式,包括适当的路径分隔符。如果servlet容器由于某种原因(例如,当从.war归档中提供内容时)无法将虚拟路径转换为真实路径,则此方法返回null。
那么,有没有用,我可以存储这些服务器也被返回的文件任何其他方式null进行getServlet().getServletContext().getRealPath("")
确实不建议从Java EE容器写入文件系统,尤其是在需要处理写入的数据时:
如果可以选择的话,我会将文件存储在数据库中或使用JCR存储库(如Jackrabbit)。