除了IDE的项目文件夹(即服务器的部署文件夹)以外,可以将其存储在任何可访问位置。有关问题答案,请参见上传的图片只有在刷新页面后才能使用:
IDE的项目文件夹中的更改不会立即反映在服务器的工作文件夹中。IDE中有一种后台任务会确保服务器的工作文件夹与最新更新同步(在IDE术语中称为“发布”)。这是你看到的问题的主要原因。
在现实世界的代码中,将上传的文件存储在Web应用程序的部署文件夹中可能根本行不通。某些服务器(默认情况下或通过配置)不会将部署的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"))
使用名称为upload.location
,值为/path/to/uploads
的<context-param>
在web.xml
中:
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
而将字节转换为字符来损坏二进制文件(如PDF文件或图像文件),而应该正确使用
InputStream
/
OutputStream
。另请参见:
How to save uploaded file in JSF、
Simplest way to serve static data from outside the application server in a Java web application和
How to save generated file temporarily in servlet based web application。