3.10.8.4. 标准文件存储实现

文件存储的标准实现以特定的文件夹结构将文件存储在一个或多个位置。

特定文件夹结构的根目录可以在cuba.fileStorageDir应用程序属性中定义,格式是以逗号分隔的路径列表。例如:

  1. cuba.fileStorageDir=/work/sales/filestorage,/mnt/backup/filestorage

如果未定义该属性,则存储将位于中间件工作目录filestorage 子文件夹中。该文件夹在标准 Tomcat 部署中是 tomcat/work/app-core/filestorage

如果定义了多个存储位置,存储的行为如下:

  • 列表中的第一个文件夹被视为 主(primary),其它文件夹被视为 备份(backup)

  • 存储的文件首先放在主文件夹中,然后复制到所有的备份目录中。

在存储文件之前,系统会检查每个文件夹是否可访问。如果无法访问主目录,系统将抛出异常而不存储文件。如果有备份目录无法访问,则文件将存储在一个可用的目录中,并记录相应的错误。

  • 从主目录中读取文件。

如果无法访问主目录,系统将从包含所需文件的第一个可用备份目录中读取文件,并记录相应的错误。

存储文件夹结构按以下方式组织:

  • 子目录有三层,代表文件上传日期 – 年 、月 、 日。

  • 文件实际保存在 目录中。文件名与相应的 FileDescriptor 对象的标识符一致。文件扩展名与源文件的扩展名一致。

  • 文件夹结构的根文件夹包含一个 storage.log 文件,其中包含每个存储文件的信息,包括用户和上传时间。存储机制本身不需要此日志,但这个日志可用于故障排除。

app-core.cuba:type=FileStorage JMX bean 显示当前的存储根目录集合,并提供以下排除故障的方法:

  • findOrphanDescriptors() – 查找数据库中有,而存储中没有对应文件的记录。

  • findOrphanFiles() – 查找存储中有,而数据库中没相应记录的文件。