admin

发表文章时上传图片或附件处理方案
场景介绍后台管理 -> 新建文章 -> 上传图片或者附件 -> 发布文章这个过程就会有个问题,一...
扫描右侧二维码阅读全文
28
2019/12

发表文章时上传图片或附件处理方案

场景介绍

后台管理 -> 新建文章 -> 上传图片或者附件 -> 发布文章

这个过程就会有个问题,一般情况下,在新建文章的时候,在未点击发布之前数据库中是没有文章记录的,但是编写文章的时候可能就需要上传图片或者附件,大多数情况是上传图片和附件与发布文章是分开的两个步骤,而不是上传图片或附件与文章内容一并提交到服务器。

那么,最终图片或附件是如何与文章关联起来的?若是新建文章期间上传了图片,但是用户最终没有点击发布就关闭了浏览器,如果不进行处理,那么这些图片或附件就有可能成了服务器中的垃圾,永远都用不到了。

一种解决思路

新建如下表结构(Kotlin):

data class Attachment (
        val id: Int,
        var path: String?,          //附件路径
        var uploadDate: Date?,      //上传时间
        var topicId: Int? = -1,     //主题ID
        var type: Int,              //类型,比如:封面图片(0) 内容图片(1) 附件(2)
        val userId: Int             //用户ID
) : Serializable

在新建文章时用户上传了附件,直接插入到tb_attachment表中去,只不过此时的topicId是默认值-1,也就是未关联状态,然后将附件ID返回给前端页面。

当用户点击发布时,假设主题ID是自增的,那么就在插入主题返回ID之后将主题ID更新到tb_attachment表中去,比如:

UPDATE tb_attachment SET topic_id = #{topicId} WHERE userId = #{userId} AND id IN(前端传过来的附件ID列表)

以上是一个正常的主题发布过程,下面讲一下对于上传图片但未发布主题情况的处理。

首先上传附件还是同上,不管用户点没点击发布按钮都将数据存进数据库,如果用户未发表就关闭了浏览器也没关系。

当用户下次新建文章时,可以查出未使用的附件:

SELECT * FROM tb_attachment WHERE userId = #{userId} AND topicId = -1

然后提示用户用这些已存在的附件可供选择使用。

假设用户一直都不使用,那我们就只能用定时任务来处理这些长时间不使用的附件了:

SELECT * FROM tb_attachment WHERE topicId = -1 AND NOW() - uploadDate > xxxxx(自定义超时删除时间)

最后就是删除磁盘文件以及数据库记录了。

Last modification:December 28th, 2019 at 03:44 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment