这几天玩《侠客风云传》上了瘾+天气炎热懒癌发作,一个文章模块拖了快一周终于在今天解决掉了。说实话并没有难点,只是往复在2个处理方案的抉择。最后还是用了以前wantsget的设计。
操作流程
- 在图片上传接口用SESSION记录收到的图片
- 提交时用正则取出所有的图片链接–>去除引用的外部图片链接
- 使用array_diff()对比session和文章中的图片,差集则为上传之后未使用的图片,删除该部分即可
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| preg_match_all('/(<\s*img[^>]+)src\s*=\s*"([^"]+)"([^>]+>)/i', $article['content'], $photos);
$temp = []; foreach($photos[2] as $k=>$v) { if(strpos($v, 'http') !== false){ continue; }else{ $temp[] = $v; } }
if(isset($temp)){ $del_array=array_diff($_SESSION['article_photos'],$temp); foreach($del_array as $img){ } }
if(!isset($temp) or count($temp) == 0 && isset($_SESSION['article_photos'])){ foreach($_SESSION['article_photos'] as $img){ } }
|
关于array_diff():
1、注意比较的顺序,如果上例的$_SESSION[‘article_photos’]和temp调换了位置,就存在删除任意目录文件的漏洞。因为他比较的结果是A数组在B数组中不存在的值(比如A=1,2,3, B=1,3,4,5,) 那么结果就是2,而不会包含4,5。(具体函数用法自行百度)
2、推荐删除文件时对文件格式做一次后缀名检查,只允许删除掉图片格式的文件。