将其存储在IDE的项目文件夹(又称为服务器的deploy文件夹)以外的任何可访问位置中,其原因仅在刷新页面后可用的“上载图像 ”答案中提到:
IDE的项目文件夹中的更改不会立即反映在服务器的工作文件夹中。IDE中有一种后台作业,用于确保服务器的工作文件夹与上次更新同步(这在IDE中称为“发布”)。这是您遇到问题的主要原因。
在现实世界中的代码中,有时无法将上传的文件存储在webapp的deploy文件夹中。某些服务器(默认情况下或通过配置)不会将已部署的WAR文件扩展到本地磁盘文件系统中,而是完全扩展到内存中。如果没有基本编辑已部署的WAR文件并重新部署它,就无法在内存中创建新文件。
即使服务器将已部署的WAR文件扩展到本地磁盘文件系统中,所有新创建的文件也将在重新部署甚至是简单的重新启动时丢失,这仅仅是因为这些新文件不属于原始WAR文件。
这其实并不重要,对我或其他人那里正是本地磁盘文件系统将被保存,只要你做不曾经使用过getRealPath()
的方法。在任何情况下,使用该方法都是令人震惊的。
到存储位置的路径又可以通过多种方式定义。你必须全部由做自己。也许这是造成混乱的原因,因为您不知何故希望服务器自动完成所有工作。请注意,@MultipartConfig(location)
并没有指定最后上传目的地,但对于案件的文件大小的临时存储位置超过存储器阈值。
因此,可以通过以下两种方式定义到最终存储位置的路径:
硬编码:
File uploads = new File("/path/to/uploads");
环境变量通过SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
通过-Dupload.location="/path/to/uploads"
以下命令在服务器启动期间的VM参数:
File uploads = new File(System.getProperty("upload.location"));
*.properties
文件输入为upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
具有名称upload.location
和值/path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
如果有,请使用服务器提供的位置,例如在JBoss AS / WildFly中:
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
无论哪种方式,您都可以轻松地参考和保存文件,如下所示:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
或者,当您要自动生成唯一的文件名以防止用户覆盖名称恰好相同的现有文件时:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
如何使用JSP / Servlet将文件上传到服务器,part
回答了如何在JSP / Servlet中获取文件?以及如何使用JSF 2.2 <h:inputFile>上传文件中part
回答了如何在JSF中获取文件?保存的文件在哪里?
注意:千万不能使用Part#write()
,因为它相对于定义的临时存储位置的路径解释@MultipartConfig(location)
。
也可以看看: