系统中图片上传设计方案

曾做过一些系统,对于图片上传的相关设计有些疑惑,经过后续的各方面研究,现有了能去除心中困惑的解决方案。

先说说以前做系统时遇到的设计问题:

有业务对象A,A中有各种属性,这其中包括附加图片的属性,而A可以关联多张图片。当要新增一个对象A时,怎么保存这些图片信息呢?

当初想到了两个方案:

①在点击保存时,将对象A的全部属性上传,这包括所有图片,然后在后台将所有图片整理后,将对应地址赋值给对象A,最后保存对象A。

②每选择一张图片时,会先上传到服务器,然后返回相关图片地址给前端页面对象,当点击保存时,页面传递的就是对象A所有的属性,此时关联的是图片在服务器的地址,此步骤并没有上传图片。

对于这两种种保存,可能会有失败情况,怎么解决数据的一致性问题?

对于①由于不可能使用事务来确保数据的一致,那么只能使用try catch ,在抛出异常时,进行手动删除相关的图片。对于②同理,在保存对象失败时,根据上传的图片地址进行删除相关数据,但其实还是不能做到100%的确保,比如中途断电情况,这些情况是忽略的,我们能做到的就是尽最大可能做到数据的一致性。

孰优孰劣

其实都不优,两种方案处理数据一致性这个问题上并不好,而且①这种方案可能会存在并发问题。so...我想到了 定时任务 这种方案能解决数据一致性问题。最终方案是在②的基础上增加定时任务,但怎么设计呢?请听吾慢慢分解:

①首先是数据库表的设计:图片对应的表,这里叫image表吧,这个表除了记录图片的一些基本信息,还要增加一个过期时间的字段expired_time,用来记录图片过期的时间。

扫描二维码关注公众号,回复: 1005870 查看本文章

②在新增一个业务对象A时,每选择一张图片,都会先上传到服务器,然后返回关联的图片对象信息(可以是保存的此条image记录,用于显示到页面,在保存业务对象A时,保存与图片的关联关系)。此过程会保存图片相关基本信息,对于expired_time这个字段的值为当前时间(new Date())。

③在业务对象A保存成功后,注意:需要更新关联的image记录 ,将expired_time设置为空。这两个动作使用事务,若保存失败,则expired_time不为空。

④下面就是开始定时任务了,定时任务在凌晨将过期时间不为空的记录清空,同时删除上传的文件。

到这,以上方案基本很好地解决了图片上传的一些相关问题。enjoy it !

猜你喜欢

转载自my.oschina.net/u/2608504/blog/1578152