zoukankan      html  css  js  c++  java
  • 用PHP整理照片和视频文件

      这个年代,谁要没有几张照片都对不起自己。从有相机到照的第一张照片起,留下了太多美好的记忆,记忆已成过往,回忆却希望永恒。奈何这些年照片太多,粗略看了下,将近70G,从这些个照片里找些回忆,翻找起来太麻烦,作为一个农场主的“老农民”,必须得想个办法整理下。梳理了自己的问题和需求如下:

     

    花了2小时,整理了一段小代码,不到3分钟所有的照片和视频就规规矩矩,服服帖帖了。代码如下:

    <?php
    /**
    * 相册大翻转
    * @param $process_dir 要处理的文件夹
    * @param $tidy_dir 目标文件夹
    * * @return bool
    */
    function read_all($process_dir,$tidy_dir)
    {
    $i=0;
    if(!is_dir($process_dir)) return false;//如果传过要处理的不是文件夹,则直接返回false
    $handle = opendir($process_dir);
    if ($handle) {
    while (($fl = readdir($handle)) !== false) {
    $temp = $process_dir . DIRECTORY_SEPARATOR . $fl;
    if (is_dir($temp) && $fl != '.' && $fl != '..') {
    read_all($temp,$tidy_dir);
    }
    else{
    if ($fl != '.' && $fl != '..') {
    if(strtolower(substr(strrchr($temp, '.'), 1))=='jpg' || strtolower(substr(strrchr($temp, '.'), 1))=='jpeg'){
    $exif_info=getExif($temp);
    if($exif_info)
    {
    if(array_key_exists('EXIF',$exif_info) && array_key_exists('DateTimeOriginal',$exif_info['EXIF']))
    {
    $file_exif_date=$exif_info['EXIF']['DateTimeOriginal'];
    }
    elseif(array_key_exists('IFD0',$exif_info) && array_key_exists('DateTime',$exif_info['IFD0']))
    {
    $file_exif_date=$exif_info['IFD0']['DateTime'];
    }
    elseif(array_key_exists('FILE',$exif_info) && array_key_exists('FileDateTime',$exif_info['FILE']))
    {
    $file_exif_date=date('Y-m-d H:i:s',$exif_info['FILE']['FileDateTime']);
    }
    else
    {
    $file_exif_date='';
    }
    }
    else
    {
    if(is_file($temp))
    {
    $file_date=filemtime($temp);
    $file_exif_date=date('Y-m-d H:i:s',$file_date);
    }
    }
    $file_dir=empty($file_exif_date)?'temp':date('Y',strtotime($file_exif_date)).DIRECTORY_SEPARATOR.date('m',strtotime($file_exif_date));
    $file_dir=$tidy_dir.DIRECTORY_SEPARATOR.$file_dir;
    $file_name=empty($file_exif_date)?md5($fl):date('Ymd@His',strtotime($file_exif_date));
    $file_full_name=$file_name.'.'.substr(strrchr($temp, '.'), 1);
    $dest_file=$file_dir.DIRECTORY_SEPARATOR.$file_full_name;
    $sour_size=filesize($temp);

    if(file_exists($dest_file))
    {
    $dest_size=filesize($dest_file);
    if($sour_size==$dest_size)
    {
    unlink($temp);
    continue;
    }
    else
    {
    $i++;
    $file_full_name=$file_name.'_'.$sour_size.'.'.substr(strrchr($temp, '.'), 1);
    }

    }
    echo $dest_file."<br>";
    create_folders($file_dir);
    rename($temp,$file_dir.DIRECTORY_SEPARATOR.$file_full_name);
    }
    else
    {
    if(is_file($temp))
    {
    $fiel_type=strtolower(substr(strrchr($temp, '.'), 1));
    $file_exif_date=filemtime($temp);
    $file_dir=empty($file_exif_date)?'temp':date('Y',$file_exif_date).DIRECTORY_SEPARATOR.date('m',$file_exif_date);
    $file_dir=$tidy_dir.DIRECTORY_SEPARATOR.'video'.DIRECTORY_SEPARATOR.$fiel_type.DIRECTORY_SEPARATOR.$file_dir;
    $file_name=empty($file_exif_date)?md5($fl):date('Ymd@His',$file_exif_date);
    $file_full_name=$file_name.'.'.substr(strrchr($temp, '.'), 1);
    $dest_file=$file_dir.DIRECTORY_SEPARATOR.$file_full_name;
    $sour_size=filesize($temp);
    if(file_exists($dest_file))
    {
    $dest_size=filesize($dest_file);
    $file_exif_date_dest=filemtime($dest_file);
    if($sour_size==$dest_size && $file_exif_date==$file_exif_date_dest)
    {
    unlink($temp);
    continue;
    }
    else
    {
    $i++;
    $file_full_name=$file_name.'_'.$sour_size.'.'.substr(strrchr($temp, '.'), 1);
    }

    }
    echo $file_dir.DIRECTORY_SEPARATOR.$file_full_name."<br>";
    create_folders($file_dir);
    rename($temp,$file_dir.DIRECTORY_SEPARATOR.$file_full_name);
    }
    }
    }
    }
    }
    }
    }

    /**
    * 检查并删除为空的文件夹
    * @param $path
    */
    function rm_empty_dir($path){
    echo '目录:'.$path."<br>";
    if(is_dir($path) && ($handle = opendir($path))!==false){
    // print_r($path);exit;
    while(($file=readdir($handle))!==false){// 遍历文件夹
    if($file!='.' && $file!='..'){
    $curfile = $path.DIRECTORY_SEPARATOR.$file;// 当前目录
    if(is_dir($curfile)){// 目录
    rm_empty_dir($curfile);// 如果是目录则继续遍历
    if(count(scandir($curfile))==2){//目录为空,=2是因为.和..存在
    rmdir($curfile);// 删除空目录
    }
    }
    }
    }
    closedir($handle);
    }
    }

    /**
    * 检查并建立目标文件夹
    * @param $dir
    * @return bool
    */
    function create_folders($dir) {
    return is_dir($dir) or (create_folders(dirname($dir)) and mkdir($dir, 0777));
    }
    /**
    * 获取图片EXIF信息
    * @param $img
    * @return array
    */
    function getExif($img){

    $exif = @exif_read_data($img,0,true);

    return $exif;

    }

    error_reporting(E_ERROR | E_WARNING | E_PARSE);
    set_time_limit(0);
    define("SOUR_DIR","J:\photo");
    define("DEST_DIR","J:\tidy-up");
    read_all(SOUR_DIR,DEST_DIR);
    rm_empty_dir(SOUR_DIR);

      不复杂吧!过几天,抽点时间,整个Python版也试试!

  • 相关阅读:
    MQCONN failed (Reason = 2277)
    MQ打开队列模式 input和input_exclusive
    mq 消息最大长度 最大是100M
    Easyui Datagrid的Rownumber行号显示问题
    ajax请求时session已过期处理方案
    seafile Windows Memcached
    seafile 接口频度控制
    你的旧船票能否搭上这艘巨轮?——解读近5年大数据产业发展规划
    第一章 输入/输出知识
    It looks like you don't have a C compiler and make utility installed. 错误
  • 原文地址:https://www.cnblogs.com/jessicor/p/12165921.html
Copyright © 2011-2022 走看看