在Java EE应用程序中,保存已上传文件的首选方法是什么?

12 浏览
0 Comments

在Java EE应用程序中,保存已上传文件的首选方法是什么?

在Java EE网络应用程序中,保存上传的文件的首选方式是什么?我在其他问题的回答中读到,不建议将文件保存到servlet容器的文件系统中,但没有进一步的解释。有人说应该将文件保存到数据库中(但我对此表示怀疑,因为之前我读到的东西)。还有人说应该使用JCR,但我能找到的唯一实现是Apache JackRabbit,似乎并不活跃?

什么是最佳选择?除了上述方法之外还有其他选择吗?欢迎提供选择某个方式而不是其他方式的原因。

0
0 Comments

在Java EE应用程序中,保存上传的文件的首选方法是根据环境的不同采取以下几种方式之一:

1. 如果您的服务器位于云中,您可以使用共享的云存储服务,如Amazon S3(顺便说一句,它有一个很好的API)。

2. 如果您的服务器位于传统的服务器上,最佳做法是使用共享的网络附加存储(NAS),但云存储也是一个选择,除非您的客户担心监管问题。

3. 如果您主要处理许多较小的文件,并且希望能够对其进行搜索,则可以选择使用BLOB数据库列。

4. 如果您处理的是大文件(如视频),那么最好研究一下使用NAS/云存储,并将数据库仅用作对NAS/S3位置的引用。

选择这些选项的原因是因为您不希望将数据限制在一个正在运行的实例中。这种架构允许额外的应用程序实例上线或进行简单的服务器迁移,并仍然可以访问共享数据。

0
0 Comments

有关在Java EE应用程序中保存上传文件的首选方法是什么?

出现的原因是使用文件系统并不是一个很好的选择,无论是从平台的角度(例如,Windows对最大文件路径长度的限制,对合法文件名的限制,以及在目录中存在超过100K个文件时减慢速度的问题),还是从架构角度考虑(考虑到应用程序的集群化):如果使用任何形式的本地存储,您将无法轻松地进行集群化(因为并非所有文件都可以轻松地从所有节点访问),因此需要选择一种可从所有集群节点访问的存储方式。数据库是一个很好的选择。根据问题的具体情况,一些形式的集群缓存(或Hadoop)也可能是一个很好的选择。

但是文件应该存储在数据库中吗?

大多数数据库都有非常不错的BLOB存储功能,可以扩展到多个TB的数据。除非您正在进行一些真正激进的操作,否则我认为没有任何理由不这样做。

是的,也许我应该重新考虑数据库存储。那么对于大小为40 KB到几MB的数千个jpg/png图像,您不会遇到问题吗?并且它不是文件系统存储的不错的替代方案吗?

实际上,存储数百万张图像是MS Sql Server设计的一个场景。我认为大多数数据库引擎都可以很好地处理它。我遇到的每个CMS都将图像保存在数据库中。

对于数千个文件来说绝对没有问题。由于BLOB存储的开销,数据库的大小可能会大于文件的大小(参见 stackoverflow.com/questions/4659441/…),但在绝对值上并不显著。此外,文件越大,开销越小。

0
0 Comments

在Java EE应用程序中,保存上传的文件的首选方法是什么?

这个问题的出现是因为我们需要确定在Java EE应用程序中保存上传的文件时,使用哪种方法更好。对于大文件,如高清视频,通过文件系统访问速度更快。另一方面,使用数据库更容易,因为你不需要知道文件实际上是如何保存的。

小数量和小文件 > 数据库

否则文件系统

使用文件系统作为存储的另一个优点是能够实现类似于apache luscene的全文搜索框架。

lucene将其索引与实际文件分开存储。你也可以为存储在数据库中的文件创建一个lucene索引。

因此,根据需要保存的文件的大小和数量,我们可以选择使用数据库或文件系统来保存上传的文件。如果是大文件,使用文件系统可以获得更快的访问速度。而对于小的文件数量,使用数据库更方便。此外,如果需要实现全文搜索功能,使用文件系统也是一个好的选择。以下是一个示例代码,演示如何将上传的文件保存到文件系统中:

// 获取上传的文件
Part filePart = request.getPart("file");
// 指定保存文件的目录
String savePath = "C:/uploads/";
// 获取上传的文件名
String fileName = getFileName(filePart);
// 将文件保存到指定目录
OutputStream out = null;
InputStream fileContent = null;
try {
    out = new FileOutputStream(new File(savePath + fileName));
    fileContent = filePart.getInputStream();
    int read = 0;
    final byte[] bytes = new byte[1024];
    while ((read = fileContent.read(bytes)) != -1) {
        out.write(bytes, 0, read);
    }
} catch (FileNotFoundException e) {
    e.printStackTrace();
} finally {
    if (out != null) {
        out.close();
    }
    if (fileContent != null) {
        fileContent.close();
    }
}

0