系统中图片上传设计方案
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
系统中图片上传设计方案相关推荐
- 如何解决markdown中图片上传的问题
如何解决markdown中图片上传的问题 参考文章: (1)如何解决markdown中图片上传的问题 (2)https://www.cnblogs.com/yu-yi/p/9535471.html 备 ...
- vue中图片上传及回显
在vue中图片上传到服务器下指定路径,并实现根据图片路径调取后台接口返回图片流在vue页面展示图片 一.图片上传 1.前台上传 <template slot-scope="scope& ...
- jeesite4中图片上传功能
图片上传 一般情况下的图片上传 1.添加图片上传标签 2.修改service中的save方法 将图片保存到实体属性中 1.修改图片上传标签,修改后的如下 效果 将图片保存到对象的拓展表中 1.代码如下 ...
- 【.net】Ueditor中图片上传和图片回显路径的设置
在csdn六百多天的游侠今日现身江湖. 问题发生的背景: 所有项目代码中,图片上传都是固定存到一个图片专属的盘符,这样就可以整个盘符对所有图片进行备份以防丢失. 但是!有一个站点所引用的百度编辑器(主 ...
- php 接收 oc 图片上传,php yii2接口中图片上传
现在在给ios给接口,遇到了一些图片上传的问题,现在可以接收到ios传来的base64编码后的数据.我是否需要解码?解码又需要怎么处理才能把图片上传到服务器,并从服务器获取URL来存入到数据库呢?求大 ...
- php中图片上传_php实现图片上传并进行替换操作
首先建立两个文件: change.html 和 change.php change.html 文件的表单代码如下: change file example. 文件: 这里有几个要注意的地方,首先看这句 ...
- web项目中图片上传
最近一直在做一个项目,但是有好多的东西都是第一次碰到,上网上查了很多资料,但是由于基础薄弱,只是堪堪了解一点. 我所想实现的是,在后台页面上传图片,存放路径到数据库中,而前台页面通过数据库可以查到,然 ...
- Ubuntu系统中本地代码上传至Github库
系统环境: Ubuntu18.04 主要步骤如下: 设置SSH Key 上传项目 1.创建SSH Key 由于本地Git仓库与Github网站之间传输主要通过SSH加密,因此需要设置SSH Key(注 ...
- 使用kindeditor中图片上传后插入不显示绝对路径的修改办法
鼓捣好了登陆,进入页面,现在鼓捣日志编辑界面的功能. 找到kindeditor插件kindeditor-all.js有的或者是kindeditor.js,找到urltype的设置, K.options ...
最新文章
- 【Sql Server】数据库的3大服务
- 把接口调用打成jar包的类怎么写_直观讲解RPC调用和HTTP调用的区别
- 运行webpack命令每次提示安装webpack-cli
- Node.js基金会官方的开发者认证准备就绪
- 8 种常见SQL错误用法,你千万别犯!
- C语言中的枚举和联合体
- Q1:spring-boot中Controller路径无法被访问的问题
- Go gomaxprocs 调高会引起调度性能损耗
- 【Linux】awk指令
- 球谐函数的概念与应用:可视化理解傅里叶级数
- Fastjson反序列化泛型类型时候的一个问题
- spring框架_Spring框架
- 从技术到求职,强烈推荐一下这9个牛逼的公众号,技术人必备
- 非常好的Struts2教程
- matlab中欧姆怎么表示,电阻的单位为欧姆,用符号()表示。 - 问答库
- md5加密校验 java_Java实现MD5加密和文件校验
- (JS)统计重复个数
- 金融牌照之基金销售、基金支付、基金管理牌照简析
- java画哆啦A梦_java如何绘制哆啦A梦 java绘制哆啦A梦代码示例
- uni-app 即时聊天
热门文章
- 粗浅看 java反射机制
- Spring - Java/J2EE Application Framework 应用框架 第 10 章 使用JDBC进行数据访问
- 在Chrome 中调试Javascript
- 信息检索(IR)的评价指标介绍-准确率、召回率、F1、mAP、ROC、AUC
- 开源图像检索工具:CaliphEmir使用方法
- Spring Boot 之路(一):一个简单的Spring Boot应用
- 解决服务器上安装不了centos7.4的问题
- Ubuntu 16.04下Markdown编辑器Haroopad
- shell-1.shell注释
- putty network error: connection refused