-1

我每天上传几千张图片到我的网络服务器。

图像文件名采用以下格式: photoXXXXXXX-Y.jpeg 其中 XXXXXXX 是记录 ID,Y 是图像数量。(示例 - photo1357936-2.jpeg)

在 MySQL 表中,有一列包含记录 id (sysid) 和一列 Y (num_of_photos)。最多有 12 张图片与一个 id 关联。

该表每天更新,并添加或删除包含 id 的记录。

我需要以某种方式遍历 id 并与图像文件名的记录 id 部分进行比较,然后删除不再与给定 id 关联的图像。

或者将图像文件名的记录 id 部分与 id 进行比较,然后删除孤立的图像。哪个逻辑更合理。

我可以使用 CRON 自动执行此任务,并且知道如何取消设置以删除文件,但不知道从哪里开始其余的。

有任何想法吗?

4

2 回答 2

2

有任何想法吗?

您实际上在自己的问题中回答了。

我需要以某种方式遍历 id 并与图像文件名的记录 id 部分进行比较,然后删除不再与给定 id 关联的图像。

不过,给你一些面包屑:

1) opendir&readdir迭代文件/文件夹以获取文件名(可能是递归的)

2)preg_match获取文件名的 X 和 Y 部分

3)mysql_querymysql_connect当然之前有等)获取X和Y的记录。

4)mysql_num_rows查看DB中是否有条目

5)如果不是:unlink

于 2012-05-14T14:20:25.787 回答
0
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// path to the images
$path_img='./media/images/inside/gallery';
// where images are listed in database
$table_name='gallery';
$field_name='file';
// unnecessary parts of filenames
$odd_tokens = array("_small", ".jpg", ".");

// limit number of image files to check, set to 10 for testing
$limit=10;
echo "begin\r\n";

//connection constants 
include './application/config/config.php';

try{
$pdo = new PDO( 'mysql:host='.config::$db_server.';dbname='.config::$db_name, config::$db_user, config::$db_pass );
}
catch (Exception $e){
    echo $e->getMessage();
    exit();
}

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$r=$pdo->query('select count(1) cnt from '.$table_name)->fetch();
echo 'count images in database: '.$r['cnt']."\r\n";

// reset some counters
$cnt_files=0;
$cnt_checked=0;
$cnt_not_found=0;
$cnt_found=0;
$path=$path_img;
if ($handle = opendir($path)) {
while ($cnt_files != $limit && false !== ($entry = readdir($handle))) {
    if ($entry != "." && $entry != "..") {
            $cnt_files++;
            if($entry > "") {
                    $cnt_checked++;
                    $img_name = str_replace ($odd_tokens,'',$path . '/' . $entry);

                    if(!checkExistsDb($pdo, $img_name, $table_name, $field_name)) {
                            $cnt_not_found++;
                            echo 'rm ' . $path . '/' . $entry . "\r\n";
//this will delete files                                unlink($path.'/'.$entry);
                    } else {
                            $cnt_found++;
                    }
            }
    }
}
closedir($handle);
}
else echo 'not found: '.$path."\r\n";
unset($pdo); 
echo 'files: '.$cnt_files.' checked: '.$cnt_checked.' not_found: '.$cnt_not_found.' found: '.$cnt_found;

function checkExistsDb($pdo, $img_name, $table_name, $field_name) {

    try{
    $st = $pdo->prepare('SELECT ' . $field_name . ' FROM ' . $table_name . ' WHERE '. $field_name . '=:filename');
    $st->execute(array(':filename'=>$img_name));
    $result = $st->fetchAll();
    }
    catch (PDOException $e) {
    echo $e->getMessage();
    }
    return $result?true:false;
}

感谢 https://www.prestashop.com/forums/topic/290936-cleanup-imgp-folder-and-image-folder-questions/

于 2015-12-24T09:03:25.707 回答