我读到here,无论如何都不应该将文件保存在服务器上,因为它不是可移植的,事务性的,需要外部参数。然而,考虑到我需要一个针对tomcat(7)的tmp解决方案,并且我对服务器机器有(相对)控制权,我想知道:
- 保存文件的最佳位置是什么?我应该保存它在
/WEB-INF/uploads
(建议不要here)或$CATALINA_BASE
下的某个地方(请参阅here)或.?JavaEE 6教程从用户(:wtf:)获取路径。注意:该文件不应该以任何方式下载。 - 我应该设置一个配置参数作为详细的here吗?我希望有一些代码(我宁愿给予它一个相对路径-所以它至少是Tomcat可移植的)-
Part.write()
看起来很有希望-但显然需要一个绝对路径 - 我对这种方法相对于数据库/JCR存储库的缺点很感兴趣
不幸的是,@BalusC的FileServlet专注于下载文件,而他的answer关于上传文件的部分跳过了在哪里保存文件的部分。
一个易于转换为使用DB或JCR实现(如jackrabbit)的解决方案将是首选。
3条答案
按热度按时间0lvr5msh1#
将其存储在IDE的项目文件夹(即服务器的部署文件夹)**以外的任何可访问位置,原因在Uploaded image only available after refreshing the page的回答中提到:
1.在真实的代码中,有些情况下,将上传的文件存储在webapp的deploy文件夹中根本不起作用。有些服务器(默认或配置)不会将部署的WAR文件扩展到本地磁盘文件系统中,而是完全在内存中。如果不编辑部署的WAR文件并重新部署它,就无法在内存中创建新文件。
1.即使服务器将部署的WAR文件扩展到本地磁盘文件系统中,所有新创建的文件也会在重新部署或甚至简单的重新启动时丢失,这仅仅是因为这些新文件不是原始WAR文件的一部分。
只要你do not ever use
getRealPath()
method,它将被保存在本地磁盘文件系统的哪个位置对我或其他任何人来说都不重要。到存储位置的路径可以通过多种方式定义。你必须自己完成。也许这就是你的困惑所在,因为你希望服务器自动完成这一切。请注意,
@MultipartConfig(location)
并不**指定最终上传目的地,但案例文件大小的临时存储位置超过了内存存储阈值。因此,最终存储位置的路径可以通过以下方式之一定义:
字符串
SET UPLOAD_LOCATION=/path/to/uploads
的环境变量:型
-Dupload.location="/path/to/uploads"
启动服务器期间的VM参数:型
*.properties
文件条目为upload.location=/path/to/uploads
:型
web.xml
<context-param>
,名称为upload.location
,值为/path/to/uploads
:型
型
无论哪种方式,您都可以轻松地引用和保存文件,如下所示:
型
或者,当您想要自动生成唯一的文件名以防止用户删除具有相同名称的现有文件时:
型
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文件或图像文件。另请参阅:
chy5wohz2#
我根据接受的答案发布我的最终方法:
字符串
其中:
型
和/WEB-INF/app.properties:
型
如果你发现一个bug,让我知道
nuypyhwy3#
Servlet规范为每个部署的Web应用程序提供了一个临时物理文件存储空间。您应该将其用于此目的。例如,当使用multipart-form-upload时:
字符串
现在,你可以对
targetFile
做任何你想做的事情。