PHP 批量读取图片文件遇到的问题与分析

记一次读取图片文件遇到的问题

  • 目标:批量读取文件【大约有5000多张图片】,然后根据文件名来处理图片,移动,重命名,写库等操作
  • 处理流程
  1. 准备临时目录和目标目录:imges/ tempImg和targeImg【tempImg目录下有XXX / XXX.JPG等图片文件】;
  2. 开始浏览目录,使用scandir()函数【使用之前最好检查下的php.ini配置文件中的disable_functions选项,以防被系统禁用了】;
  3. 开始循环读取图像文件,此处读取到的所有图片名【进行编码转换】,如果不进行编码转换,获取到的图片名在后面的逻辑处理时会全部乱码,会导致一些问题【如序列化转换写库时,会有可能编码不一致导致失败,数据丢失的问题】;
  4. 图片文件进行个重命名,使用重命名(“旧文件”,“新文件“)函数,可能会导致失败的原因<原因1:旧文件不存在,原因二:新文件的父级目录不存在等> ,重名之后,会自动删除原始文件;
  5. 完成

相关代码

<?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];
}
?>

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值