Java 杂谈PHP实战PHP经验分享

从源头杜绝Ajax上传垃圾文件

2019-03-26  本文已影响1人  wolf_43b9

表单数据与文件上传异步提交,富文本编辑器图片上传(删除时只删除标签),都会产生垃圾文件。相信为此头疼的同学不在少数,网上查,有一些解决方案,但都只是减少了,并未彻底回收。


我不关心它是怎么来的,我只关心它是怎么没的。

我的解决方案:

异步文件上传流程

上传文件控制表

CREATE TABLE `upload_file` (
  `id` int(10) NOT NULL,
  `path` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件相对路径',
  `is_used` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' COMMENT '0:未使用,1:使用',
  `table_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '使用该文件的表名',
  `table_id` int(10) UNSIGNED DEFAULT NULL COMMENT '使用该文件的表主键id',
  `trans_id` varchar(100) NOT NULL COMMENT '传输id,图片与数据匹配用',
  `created_at` int(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='上传文件表';

流程一看就很清楚,说几个关键点:

  1. trans_id,如果新表单,新上传的文件,trans_id参数保证唯一性就可以了,方法很多,请自由发挥;如果是编辑状态,需要根据表名及表主键id查找旧的trans_id,这样才能对历史数据进行编辑。
  2. 文件列表,因为文件上传唯一能标识此文件的,只有相对路径,也就是存储在数据表中的路径字符串,所以每次表单提交时,需要服务器端表单处理的代码把表单中的文件列表收集出来,提交给回调地址。
  3. 回调时查相同trans_id,不在表单提交的文件列表中的记录,标识为未使用(is_used=0),在文件列表中的标识为使用(is_used=1)。
  4. 定期删除表中未使用文件及记录。
  5. 文件上传地址统一,富文本编辑器或者其它异步上传插件都用统一文件上传地址,统一控制。

操作看起来繁琐,但能从源头解决垃圾文件问题。
如果还有其它简便方法,欢迎评论建议。
[源码(PHP版本)]https://github.com/mydevc/uploadfile

上一篇下一篇

猜你喜欢

热点阅读