JSP: 上传文件到服务器的最佳实践

3

我正在使用multipart form、Apache FileUpload等方式上传文件,目前运行正常。

但是,我想知道在服务器上保存文件的最佳实践或常见做法,包括以下内容:

  • 为服务器中的文件命名(例如:哪个名称更好?一些UUID生成的名称还是在插入文件关联数据时由数据库表生成的行ID)
  • 服务器内文件的最佳位置(例如:在Linux服务器上,应该使用哪个文件夹或分区。是否需要加密上传的文件?)
  • 当我放置一个链接从浏览器访问文件时:直接访问还是使用Servlet更好?

针对您的最后一个问题,没有办法在没有经过servlet的情况下访问服务器上的文件。至少您将需要一个默认servlet。 - gigadot
1
大多数问题都可以根据您和您的架构选择最适合您的答案来回答。文件的加密也取决于您的需求,但即使是机密银行文件,我公司的服务器上也没有要求加密文档的请求。 - scrappedcola
@gigadot,你可以设置Apache + Tomcat安装,并允许Apache访问应用程序的上传目录。虽然我强烈不建议这样做,但是这是可能的。 - f_puras
@f_puras 我同意它不叫做 servelt,但它是 apache httpd 进程,通过 http 流传递文件。没有通过 http 协议直接从互联网访问操作系统文件系统的方法。 - gigadot
2个回答

1
  1. 如果您采用这种方式(文件存储在文件系统中,元数据存储在数据库中),那么为文件名设置行ID并不是一个坏主意(至少可以确保唯一性)。不幸的是,您必须确保文件系统和数据库同步,因此需要仔细编写代码。
  2. 如果您关心性能,可以将文件存储在单独的硬盘驱动器(或NAS)上。请注意,如果文件数量很大(数千个),则不应将它们全部放在一个文件夹中,而应将它们分组到子文件夹中,每个子文件夹最多包含几百个文件。这将确保在文件数量增加时访问时间较低。使用加密取决于您的业务需求(文件是否包含机密数据?)。
  3. Servlet是更好的方法,因为它隐藏了客户端的真实存储细节,并且对于应用程序未来的更改更具有可靠性。它还具有其他一些好处(例如,您可以实现访问控制,在浏览器/代理中获得缓存等)。如果您使用加密,则必须使用Servlet。

0

由于在服务器文件系统操作中反复遇到问题(缺少权限,在不同平台上行为不同),我建议将文件数据作为BLOB存储在数据库中。这样,您就不需要详细说明唯一的文件命名方案,并且所有敏感数据都将位于一个位置。

在这种情况下,您需要一个用于下载的servlet,即使是访问存储在文件中的数据,这也是更好的方式。


我之前也曾经遇到过同样的问题。最终,我决定将文件保存在文件系统中,因为存储的数据量预计会非常大(以TB或原始视频为单位)。我想知道像MySQL或PostgreSQL这样的数据库在处理如此大量的BLOB数据时会表现如何? - Adam Dyga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接