首页 > 解决方案 > PHP exif_read_data():无法打开文件查询

问题描述

我正在尝试通过 EXIF DateTime Original 对图像文件数组进行排序,替换用于使用 stat() 按 mtime 对图像进行排序的原始代码。

用于通过mtime对图像文件进行排序的原始代码如下:

// display photos in album
$src_folder = $mainFolder.'/'.$_REQUEST['album']; 
$src_files = array_diff(scandir($src_folder ), array('..', '.'));
$files = array();

/*** sort by most recent uploaded file ***/
foreach ($src_files as $key=>$img) {
    $stat_folders = stat($src_folder .'/'. $img);
    $file_time[$key] = $stat_folders['ctime'];
}
array_multisort($file_time, SORT_DESC, $src_files);
/*** end sort ***/

我已经测试了以下代码,可以根据需要对数组进行排序:

function getExifDate($filename)
{
    $exif_odate = exif_read_data($filename, 0, true);
    if($exif_odate === false){
        return filemtime($filename);
    }
    if(isset($exif_odate['EXIF']['DateTimeOriginal'])){
        return strtotime($exif_odate['EXIF']['DateTimeOriginal']);
    } else {
        return filemtime($filename);
    }
}
$src_folder = 'folder/'; 
$src_files = glob($src_folder . '*.jpg'); 
array_multisort(array_map('getExifDate', $src_files), SORT_NUMERIC, SORT_DESC, $src_files);

但是,当我尝试使用以下代码集成新的排序方法时:

// display photos in album
$src_folder = $mainFolder.'/'.$_REQUEST['album']; 
$src_files = array_diff(scandir($src_folder ), array('..', '.'));
$files = array();

/*** sort files by date photo taken ***/
function getExifDate(){
    global $src_folder, $src_files;

    $src_images = array();
    foreach ($src_files as $img){       
        $exif_odate = exif_read_data($img, 0, true);
        //      $exif_odate = exif_read_data($src_folder . $img, "FILE,COMPUTED,ANY_TAG,IFD0,THUMBNAIL,COMMENT,EXIF", true);   <-- doesn't work either!
        $src_date = strtotime($exif_odate['EXIF']['DateTimeOriginal']);
        $src_images[$img] = $src_date;
    }
}
array_multisort(array_map('getExifDate', $src_files), SORT_NUMERIC, SORT_DESC, $src_files);
/*** end sort ***/

加载页面时,会为每个尝试读取的图像文件生成以下错误消息:

警告:exif_read_data():无法在...中打开文件

参考以下代码行:

$exif_odate = exif_read_data($img, 0, true);

将该行代码更改为以下内容没有任何区别:

$exif_odate = exif_read_data($src_folder . $img, "FILE,COMPUTED,ANY_TAG,IFD0,THUMBNAIL,COMMENT,EXIF", true);

...并且图像缩略图显示未排序...不可避免。

任何有关如何解决此问题的指导将不胜感激。

标签: phpsortingdatetimeexif

解决方案


感谢 04FS 帮我解决问题:

只需替换以下原始代码:

/*** sort by most recent uploaded file ***/
foreach ($src_files as $key=>$img) {
    $stat_folders = stat($src_folder .'/'. $img);
    $file_time[$key] = $stat_folders['ctime'];
}
array_multisort($file_time, SORT_DESC, $src_files);
/*** end sort ***/

和:

/*** sort files by date photo taken ***/
foreach ($src_files as $key=>$img){       
    $exif_odate = exif_read_data($src_folder . '/' . $img, 0, true);
    $file_time[$key] = strtotime($exif_odate['EXIF']['DateTimeOriginal']);
}
array_multisort($file_time, SORT_NUMERIC, SORT_DESC, $src_files);
/*** end sort ***/

解决了排序问题。:)


推荐阅读