记一次读取图片文件遇到的问题
- 目标:批量读取文件【大约有5000多张图片】,然后根据文件名来处理图片,移动,重命名,写库等操作
- 处理流程
- 准备临时目录和目标目录:imges/ tempImg和targeImg【tempImg目录下有XXX / XXX.JPG等图片文件】;
- 开始浏览目录,使用scandir()函数【使用之前最好检查下的php.ini配置文件中的disable_functions选项,以防被系统禁用了】;
- 开始循环读取图像文件,此处读取到的所有图片名【进行编码转换】,如果不进行编码转换,获取到的图片名在后面的逻辑处理时会全部乱码,会导致一些问题【如序列化转换写库时,会有可能编码不一致导致失败,数据丢失的问题】;
- 图片文件进行个重命名,使用重命名(“旧文件”,“新文件“)函数,可能会导致失败的原因<原因1:旧文件不存在,原因二:新文件的父级目录不存在等> ,重名之后,会自动删除原始文件;
- 完成
相关代码
<?php
//主要用来对图片进行批量移动命名处理加工
public function scanNewDirContent()
{
$tempDir = 'image/tempImg';
$repairDir = 'image/targetImg';
if (!is_dir($repairDir)) {//创建目标文件目录
mkdir($repairDir);
}
$dirInfos = scandir($tempDir);
$total = [];
$limit = 0;
foreach ($dirInfos as $value) {
if ($value == '.' || $value == '..') {
continue;
}
//原始文件的子目录
$child_dir = $tempDir . '/' . $value;
//新文件的的空目录【必须检测,否则后面移动重命名会失败】
$new_file_dir = $repairDir . '/' . $value;
if (!is_dir($new_file_dir)) {
mkdir($new_file_dir);
}
$file = [];
if (is_dir($child_dir)) {
$new_dir = scandir($child_dir);
$i = 0;
foreach ($new_dir as $vals) {
if ($vals == '.' || $vals == '..') {//剔除字段的文件内容
continue;
}
$name = explode('.', $vals);
//组装新的文件名,防止出现因编码问题,导致路径无法解析
$new_file_name = time() . rand(10000, 99999) . '.' . $name[1];
//新的文件路径
$new_file_url = $new_file_dir . '/' . $new_file_name;
//旧的文件路径
$old_file_url = $child_dir . '/' . $vals;
//EUC-CN:中文编码gb2312,gbk的常用表示方法
if(mb_detect_encoding($name[0], ['ASCII', 'UTF-8', 'GB2312', 'GBK', 'BIG5'])=='EUC-CN'){
$file_name= iconv("gbk", "utf-8", $name[0]);
}else{
$file_name=$name[0];
}
//组装成一组【name表示图片的名字,url表示图片的新路径的】数组。
$file[$i]['name'] = $file_name;
$file[$i]['url'] = $new_file_url;
//移动文件单个文件
rename($old_file_url, $new_file_url);
$i++;
}
//目录名作为键名
$total[$value] = $file;
} else {
continue;
}
$limit++;
//删除原始目录
rmdir($child_dir);//只能删除空目录
if ($limit == 2000) {
break;
}
}
$all_key = array_keys($total);//获取以目录名组成的数组;
return ['file_content'=>$total,'file_key'=>$all_key];
}
?>