文档章节

系统中图片上传设计方案

道酬勤
 道酬勤
发布于 2017/05/30 15:44
字数 804
阅读 65
收藏 1

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

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

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

当初想到了两个方案:

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

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

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

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

孰优孰劣

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

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

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

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

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

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
道酬勤
粉丝 12
博文 39
码字总数 20898
作品 0
深圳
程序员
私信 提问
构建高可扩Web架构和分布式系统实战(1)

构建可扩展的分布式Web应用程序应遵循可用性、性能、可靠性、可扩展、易管理、成本等这些原则。此外,本文还重点讲解了服务、冗余和分区,希望对你有帮助。 Web分布式系统设计的原则 构建并运...

o0无忧亦无怖
2015/10/10
34
0
关于推荐系统设计

在我们的系统设计中,推荐的内容主要涉及到两方面:1,为当前用户推荐可能感兴趣的用户;2、使用者推荐可能感兴趣的内容。写这个文章主要是总结一下我们设计中的经验,也可以暴露一下我们的不...

saintatgod
2015/12/15
413
0
构建高可扩Web架构和分布式系统实战

构建可扩展的分布式web应用程序应遵循可用性、性能、可靠性、可扩展、易管理、成本等这些原则。此外,本文还重点讲解了服务、冗余和分区,希望对你有帮助。 开源软件已经成为许多大型网站的基...

Yamazaki
2013/01/16
0
0
使用Nginx搭建简单图片服务器

最近经常有人问图片上传怎么做,有哪些方案做比较好,也看到过有关于上传图片的做法,但是都不是最好的,今天再这里简单讲一下Nginx实现上传图片以及图片服务器的大致理念。 如果是个人项目或...

抢地主
2017/11/04
0
0
Facebook又是如何应对千亿级别的图片存储、每秒百万级别的图片查询?

经典论文翻译导读之《Finding a needle in Haystack: Facebook’s photo storage》 英文原文:Facebook Haystack,编译:ImportNew - 储晓颖 新浪微博:@疯狂编码中的xiaoY 【译者预读】面对...

markYun
2013/03/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Idea

command + E : 打开最近编辑过的文件 command + shift + O : 打开指定文件 command + O : 打开指定类 shift+command+delete 打开上一次编辑过的地方 option + command + t 代码块包含 option...

xpttxsok
38分钟前
2
0
FTP 协议 1.0

自己制作的FTP协议:

Explorer0
49分钟前
2
0
Android 通过DrawableInflater加载自定义Drawable

一、Drawable 在Android系统张,图形图像的绘制需要在画布上进行操作和处理,但是绘制需要了解很多细节以及可能要进行一些复杂的处理,因此系统提供了一个被称之为Drawable的类来进行绘制处理...

IamOkay
今天
3
0
灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

灵活无处安放,所以选择流浪....《漆黑的空间》& 《灰色轨迹》

yizhichao
今天
1
0
Kafka+Flink 实现准实时异常检测系统

1.背景介绍 异常检测可以定义为“基于行动者(人或机器)的行为是否正常作出决策”,这项技术可以应用于非常多的行业中,比如金融场景中做交易检测、贷款检测;工业场景中做生产线预警;安防...

架构师springboot
今天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部