系统中图片上传设计方案
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
總結
以上是生活随笔為你收集整理的系统中图片上传设计方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux监控(添加自定义监控项,配置邮
- 下一篇: 用CSS实现首字下沉效果,仿word的首