PHP 图片的冗余处理

这几天玩《侠客风云传》上了瘾+天气炎热懒癌发作,一个文章模块拖了快一周终于在今天解决掉了。说实话并没有难点,只是往复在2个处理方案的抉择。最后还是用了以前wantsget的设计。

操作流程

  1. 在图片上传接口用SESSION记录收到的图片
  2. 提交时用正则取出所有的图片链接–>去除引用的外部图片链接
  3. 使用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、推荐删除文件时对文件格式做一次后缀名检查,只允许删除掉图片格式的文件。


评论区