正如标题所说,在 Java EE Web 应用程序中保存上传文件的首选方式是什么?我阅读了一些关于其他问题的答案,即不建议将文件保存到 servlet 容器的文件系统,而无需进一步解释。有人说你应该将它保存到数据库中(但我怀疑我之前读过的内容),有人说你应该使用 JCR,我能找到的唯一实现是 Apache JackRabbit,它似乎不是很活跃?
什么是最好的选择?除了上面提到的还有没有?您会选择其中一个的原因是显而易见的。
正如标题所说,在 Java EE Web 应用程序中保存上传文件的首选方式是什么?我阅读了一些关于其他问题的答案,即不建议将文件保存到 servlet 容器的文件系统,而无需进一步解释。有人说你应该将它保存到数据库中(但我怀疑我之前读过的内容),有人说你应该使用 JCR,我能找到的唯一实现是 Apache JackRabbit,它似乎不是很活跃?
什么是最好的选择?除了上面提到的还有没有?您会选择其中一个的原因是显而易见的。
根据您的环境,您可能需要做以下几件事之一:
您的服务器在云端。您需要使用共享云存储服务,例如Amazon S3(顺便说一句,它有一个不错的 API)
您托管在传统服务器上。在这种情况下,最佳做法是使用共享 NAS,但云存储也是一种选择,除非您的客户有监管问题
您主要处理许多小(er)文件,并且希望它们可搜索。对于这种情况,您将选择一个 BLOB 数据库列。
如果您正在处理大文件(如视频),您可能需要查看 NAS/云存储,并将数据库用作对 NAS/S3 位置的参考
这些选项的原因是因为您不想将数据沙箱化到正在运行的实例中。这种架构允许您的应用程序的其他实例联机或进行简单的服务器迁移,并且仍然可以访问共享数据。
正如您已经看到的,JCR 并不是那么受欢迎。从平台的角度来看,使用文件系统都不是一个好主意(例如,windows 对最大文件路径长度有限制,对合法文件名的限制,以及目录中 >~100K 文件在减速到爬行之前的问题) 和架构视角 - 考虑集群您的应用程序:
如果您使用任何形式的本地存储,您将无法轻松进行集群(因为并非所有文件都可以从所有节点轻松访问),因此您需要选择可从所有集群节点访问的内容。DB 非常适合。某种集群缓存(或 hadoop)也可能很合适,具体取决于您的问题的具体情况。
In my opinion this message this question depends on what you want to save. Big files like HD video is are much faster accessed via filesystem. Using a database on the other hand makes it easier because you don't have to know the file are actually saved.
Small amount and small files > database Otherwise filesystem
Another pro for using filesystem as storage is the ability to implement a full text search framework like apache luscene.