2019独角兽企业重金招聘Python工程师标准>>>

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

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

有业务对象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 !

转载于:https://my.oschina.net/rightemperor/blog/1578152

系统中图片上传设计方案相关推荐

  1. 如何解决markdown中图片上传的问题

    如何解决markdown中图片上传的问题 参考文章: (1)如何解决markdown中图片上传的问题 (2)https://www.cnblogs.com/yu-yi/p/9535471.html 备 ...

  2. vue中图片上传及回显

    在vue中图片上传到服务器下指定路径,并实现根据图片路径调取后台接口返回图片流在vue页面展示图片 一.图片上传 1.前台上传 <template slot-scope="scope& ...

  3. jeesite4中图片上传功能

    图片上传 一般情况下的图片上传 1.添加图片上传标签 2.修改service中的save方法 将图片保存到实体属性中 1.修改图片上传标签,修改后的如下 效果 将图片保存到对象的拓展表中 1.代码如下 ...

  4. 【.net】Ueditor中图片上传和图片回显路径的设置

    在csdn六百多天的游侠今日现身江湖. 问题发生的背景: 所有项目代码中,图片上传都是固定存到一个图片专属的盘符,这样就可以整个盘符对所有图片进行备份以防丢失. 但是!有一个站点所引用的百度编辑器(主 ...

  5. php 接收 oc 图片上传,php yii2接口中图片上传

    现在在给ios给接口,遇到了一些图片上传的问题,现在可以接收到ios传来的base64编码后的数据.我是否需要解码?解码又需要怎么处理才能把图片上传到服务器,并从服务器获取URL来存入到数据库呢?求大 ...

  6. php中图片上传_php实现图片上传并进行替换操作

    首先建立两个文件: change.html 和 change.php change.html 文件的表单代码如下: change file example. 文件: 这里有几个要注意的地方,首先看这句 ...

  7. web项目中图片上传

    最近一直在做一个项目,但是有好多的东西都是第一次碰到,上网上查了很多资料,但是由于基础薄弱,只是堪堪了解一点. 我所想实现的是,在后台页面上传图片,存放路径到数据库中,而前台页面通过数据库可以查到,然 ...

  8. Ubuntu系统中本地代码上传至Github库

    系统环境: Ubuntu18.04 主要步骤如下: 设置SSH Key 上传项目 1.创建SSH Key 由于本地Git仓库与Github网站之间传输主要通过SSH加密,因此需要设置SSH Key(注 ...

  9. 使用kindeditor中图片上传后插入不显示绝对路径的修改办法

    鼓捣好了登陆,进入页面,现在鼓捣日志编辑界面的功能. 找到kindeditor插件kindeditor-all.js有的或者是kindeditor.js,找到urltype的设置, K.options ...

最新文章

  1. 【Sql Server】数据库的3大服务
  2. 把接口调用打成jar包的类怎么写_直观讲解RPC调用和HTTP调用的区别
  3. 运行webpack命令每次提示安装webpack-cli
  4. Node.js基金会官方的开发者认证准备就绪
  5. 8 种常见SQL错误用法,你千万别犯!
  6. C语言中的枚举和联合体
  7. Q1:spring-boot中Controller路径无法被访问的问题
  8. Go gomaxprocs 调高会引起调度性能损耗
  9. 【Linux】awk指令
  10. 球谐函数的概念与应用:可视化理解傅里叶级数
  11. Fastjson反序列化泛型类型时候的一个问题
  12. spring框架_Spring框架
  13. 从技术到求职,强烈推荐一下这9个牛逼的公众号,技术人必备
  14. 非常好的Struts2教程
  15. matlab中欧姆怎么表示,电阻的单位为欧姆,用符号()表示。 - 问答库
  16. md5加密校验 java_Java实现MD5加密和文件校验
  17. (JS)统计重复个数
  18. 金融牌照之基金销售、基金支付、基金管理牌照简析
  19. java画哆啦A梦_java如何绘制哆啦A梦 java绘制哆啦A梦代码示例
  20. uni-app 即时聊天

热门文章

  1. 粗浅看 java反射机制
  2. Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问
  3. 在Chrome 中调试Javascript
  4. 信息检索(IR)的评价指标介绍-准确率、召回率、F1、mAP、ROC、AUC
  5. 开源图像检索工具:CaliphEmir使用方法
  6. Spring Boot 之路(一):一个简单的Spring Boot应用
  7. 解决服务器上安装不了centos7.4的问题
  8. Ubuntu 16.04下Markdown编辑器Haroopad
  9. shell-1.shell注释
  10. putty network error: connection refused