但是这个方法仍然存在缺陷,因为现实里不是所有的表单页面,都像论坛发帖这个页面一样,当你点下提交,整个页面提交内容到服务器后,就会关闭(或跳转到另外的页面)。 有一些表单页面很复杂,所以,允许用户一边保存,一边编辑,这类页面有个特点就是,点保存后只会有个提示告诉你提交了,你本人还是停留在这个编辑页面上。这种就没办法沿用上述那个[移动上传文件到正式保存路径]这个逻辑的。因为你挪动文件的路径后,第一就是页面访问这些文件的路径都会发生变化,这导致你必须更新本地页面上这些附件附图的访问路径,否则它们都会变成红 x 无法访问了。这种保存一次后,还必须更新页面上数据的方式,对某些有大量附件的表单特别不友好。
我的预想方案如下。把所有附件,先转换成「资源」表的一个记录。资源表负责存储附件的相对路径,外部只能通过资源 ID 去关联附件。然后你就可以在资源表中维护附件的状态、关联性等,以及延时或者定期清理没有外部关联的资源记录和其对应的文件。因为「资源」个数据库表,它可以跟主业务保持事务一致性。资源表跟附件本身的一致性则需要额外保证,一般也只是保证从资源表到附件的单向一致性——只需要先保存文件再插数据,同时禁止外部删除文件即可。如果需要保证资源表跟附件的完全一致性,那开发成本将非常高。此方案仅存在与预想,因为参与过的老项目压根不会改,新项目涉及到开发时间就连我自己都不会上这种方案。