当我尝试在php中按filemtime对图像进行排序时,scandir子文件夹会出现错误(filemtime():sta



我几年前写了一个php库,一切都很好,直到我在scandir中放了一个子文件夹(foto(,我有以下结构:

  • 根/库/
  • root/gallery/foto/
  • 根/图库/拇指/
  • root/图库/tumbs_b/
  • root/gallery/gallery.php

文件夹foto中有所有较大的照片,thumbs中有所有的微缩模型,thumbs_b中有所有中等的微缩模型。

代码运行良好,直到我不断评论排序数组:

#array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);

如果我删除评论,我会得到很多错误,听起来像是与文件时间路径有关的问题。。。

array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);

这是我在尝试按文件时间对图像进行排序时遇到的错误。

警告:第84行D:\Web\test\www\gallery\gallery.php中的Castellamare_Del_Golfo_16082016_001.jpg的filemtime((:stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\gallery.php中Cefalu14082017_001.jpg的stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\gallery.php中Cefalu14082017_002.jpg的stat失败
警告:第84行D:\Web\test\www\gallery\gallery.php中的Charleston_Mondello_4062014_001.jpg的filemtime((:stat失败
警告:第84行D:\Web\test\www\gallery\gallery.php中Charleston_Mondello_15032010_001.jpg的filemtime((:stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\gallery.php中的Concerto_Politama_Palermo_2507202015_001.jpg的stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\callery.php中Foro_ItalicoMagnolic_02022014_001.jpg的stat失败
警告:第84行D:\Web\test\www\gallery\gallery.php中Gattino_8092008_001.jpg的filemtime((:stat失败
警告:第84行D:\Web\test\www\gallery\gallery.php中Mondello_Lido_4062014_001.jpg的filemtime((:stat失败
警告:第84行D:\Web\test\www\gallery\gallery.php中Mondello_Asseggiata_10092007_001.jpg的filemtime((:stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\gallery.php中的Riserva_Nature_Capo_Gallo_082016_001.jpg的stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\gallery.php中的Riserva_Nature_Capo_Gallo_082016_002.jpg的stat失败
警告:filemtime((:第84行D:\Web\test\www\gallery\gallery.php中Terrasini_Cultura_2312018_001.jpg的stat失败

并且不再显示图像。

如何修复此错误?听起来我像个博士虫。如果我在没有附加路径foto的情况下放入scandir($src_folder);,并且如果我将所有图像从root/gallery/foto/移动到root/gallery/,则没有错误。问题是,如果scandir正在处理子文件夹,则排序图像不起作用。我有php 8.1.11 64位和apache 2.4.53 64位。

这是一个部分代码,所有完整的代码大约为15kb,这是用于测试目的的短版本。。。

<?php
$pageText = 'Page ';
$pageOfText = ' of ';
$imageText1 = ' image';
$imageText2 = ' images';
$photoText = 'photo';
$comments = 'Comments';
$thumb_width = 120;  // width of thumbnails
$thumb_height = 85;  // height of thumbnails
$itemsPerPage = 5;  // number of images per page
$src_folder = '.';  // current folder images
$src_files = scandir("$src_folder/foto");  // files in current folder
$extensions = array(".jpeg",".jpg",".png",".gif");  // allowed extensions in photo gallery
//  display pagination

function print_pagination($pageText, $pageOfText, $numPages, $currentPage) 
{
$page = 1;
$page = (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0) 
? htmlspecialchars((int) $_GET['page'], ENT_QUOTES | ENT_HTML401, 'UTF-8') 
: 1;
$page = str_replace("", "", $page);
$currentPage = (is_numeric($currentPage) && $currentPage > 0) 
? htmlspecialchars((int) $currentPage, ENT_QUOTES | ENT_HTML401, 'UTF-8') 
: 1;
$currentPage = str_replace("", "", $currentPage);
echo $pageText . $currentPage . $pageOfText . $numPages;
$naviPage = array();
if ($numPages > 1) {
$min = max($currentPage - 2, 2);
$max = min($currentPage + 2, $numPages - 1);
$naviPage[] = "1";
if ($min > 2) {
$naviPage[] = "...";
}
for ($i = $min; $i < $max + 1; $i++) {
$naviPage[] = "$i";
}
if ($max < $numPages - 1) {
$naviPage[] = "...";
}
$naviPage[] = "$numPages";
} else {
$naviPage = array("1");
}
if ($numPages > 1) {
echo '&nbsp;&nbsp;';
if ($currentPage > 1) {
$prevPage = $currentPage - 1;
echo '<a href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $prevPage .'" class="direction">&#10096;&#10096;</a>';
}
foreach ($naviPage as $currentNaviPage) {
if ($currentNaviPage == "...") {
echo '<span class="paginate disabled">'. $currentNaviPage .'</span>';
} elseif ($page == $currentNaviPage) {
echo '<a class="current-paginate" href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $currentNaviPage .'">'. $currentNaviPage .'</a>';
} else {
echo '<a class="paginate" href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $currentNaviPage .'">'. $currentNaviPage .'</a>';
}
}
if ($currentPage != $numPages) {
$nextPage = $currentPage + 1;
echo '<a href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $nextPage .'" class="direction">&#10097;&#10097;</a>';
}
}
}

$files = array();
foreach ($src_files as $file) {
$ext = strtolower(strrchr($file, '.'));
if (in_array($ext, $extensions)) {
array_push($files, $file);
}
}
if (count($files) == 0) {
echo 'No photos';
} else {
$numPages = ceil(count($files)/$itemsPerPage);
if (isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0) {
$currentPage = htmlspecialchars((int) $_GET['page'], ENT_QUOTES | ENT_HTML401, 'UTF-8');
$currentPage = str_replace("", "", $currentPage);
if ($currentPage > $numPages) {
$currentPage = $numPages;
}
} else {
$currentPage = 1;
}
$start = ($currentPage * $itemsPerPage) - $itemsPerPage;
for ($i = $start; $i < $start + $itemsPerPage; $i++) {
if (isset($files[$i]) && is_file($src_folder .'/foto/'. $files[$i])) {
#array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);
echo '
<div class="thumb"><a href="'. $src_folder .'/foto/'. $files[$i] .'" data-fancybox data-caption="'. trim(pathinfo($files[$i], PATHINFO_FILENAME)) .'"><img src="'. $src_folder .'/thumbs/'. $files[$i] .'" width="'.$thumb_width.'" height="'.$thumb_height.'" alt="'.$photoText.'"></a><br><div class="srtgs" id="rt_'. $files[$i] .'"></div><br><div class="time">'. date("d-m-Y H:i:s", filemtime($src_folder .'/foto/'. $files[$i])) .'</div><div class="item"><a class="item" href="./comments.php?photo='. $files[$i] .'" target="_blank">'. $comments .'</a></div></div>';
} else {
if (isset($files[$i])) {
echo $files[$i];
}
}
}
$counter = count($files);
if ($counter <= 1) {
$numImages = $imageText1;
} else {
$numImages = $imageText2;
}
print_pagination($pageText, $pageOfText, $numPages, $currentPage);
}
?>

从我的dropbox中所有用于测试目的的文件:

测试库02.10.2022.zip

没有文件夹的测试库foto 02.10.2022.zip

我通过放置一个为filemtime提供完整路径的函数来解决问题:

function filetime_callback($a, $b) {
global $src_folder;
if (filemtime($src_folder.'/foto/'.$a) === filemtime($src_folder.'/foto/'.$b)) {
return 0;
}
return filemtime($src_folder.'/foto/'.$a) > filemtime($src_folder.'/foto/'.$b) ? -1 : 1;
}

最后,我可以使用这样一种简单的方法按文件时间对图像进行排序:

usort($files, 'filetime_callback');

问题是filemtime找不到在子文件夹中提供的图像。

谢谢。

相关内容

  • 没有找到相关文章

最新更新