将其存储在 IDE 项目文件夹(即服务器的部署文件夹)的可访问位置 除了 的任何位置,原因在Uploaded image only available after refreshing the page 的答案中提到:
-
IDE 项目文件夹中的更改不会立即反映在服务器的工作文件夹中。 IDE 中有一种后台作业,它负责服务器的工作文件夹与上次更新同步(这在 IDE 术语中称为“发布”)。这是您看到的问题的主要原因。
-
在现实世界的代码中,有时将上传的文件存储在 webapp 的部署文件夹中根本不起作用。一些服务器(默认情况下或通过配置)不会将部署的 WAR 文件扩展至本地磁盘文件系统,而是完全扩展至内存中。如果不基本上编辑已部署的 WAR 文件并重新部署它,则无法在内存中创建新文件。
-
即使服务器将部署的 WAR 文件扩展至本地磁盘文件系统,所有新创建的文件在重新部署甚至简单重启时都会丢失,这仅仅是因为这些新文件不是原始 WAR 文件的一部分。
只要你do not ever use getRealPath() method,它将被保存在本地磁盘文件系统的哪个位置对我或其他任何人来说都无关紧要。使用该方法在任何情况下都会令人担忧。
存储位置的路径又可以通过多种方式定义。您必须自己全部完成。也许这就是造成您困惑的地方,因为您以某种方式期望服务器会自动执行所有操作。请注意,@MultipartConfig(location) 确实没有指定最终上传目的地,但案例文件大小的临时存储位置超过了内存存储阈值。
因此,最终存储位置的路径可以通过以下任一方式定义:
-
硬编码:
File uploads = new File("/path/to/uploads");
-
环境变量通过SET UPLOAD_LOCATION=/path/to/uploads:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
-
服务器启动期间的VM参数通过-Dupload.location="/path/to/uploads":
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在How to upload files to server using JSP/Servlet?中回答,如何在JSF中获得part在How to upload file using JSF 2.2 <h:inputFile>? Where is the saved File?中回答
注意:不要使用Part#write(),因为它会解释相对于@MultipartConfig(location) 中定义的临时存储位置的路径。还要确保您不会通过错误地使用Reader/Writer 而不是InputStream/OutputStream,在读/写期间将字节转换为字符来损坏二进制文件,例如PDF文件或图像文件。
另见: