提问人:Alessandro 提问时间:10/2/2022 最后编辑:Alessandro 更新时间:10/4/2022 访问量:126
当我尝试在 php 中按 filemtime 对图像进行排序时,scandir 子文件夹出现错误(filemtime():stat 失败)
scandir subfolder gives errors when I try to sort images by filemtime in php (filemtime(): stat failed)
问:
几年前我写了一个php画廊,一切正常,直到我在scandir中放入一个子文件夹(foto),我有以下结构:
- 根/图库/
- 根/图库/照片/
- 根/图库/拇指/
- 根/图库/thumbs_b/
- 根/图库/图库.php
文件夹中有所有较大的照片,里面有所有微缩模型,里面有所有中等微缩模型。foto
thumbs
thumbs_b
代码工作正常,直到我继续注释排序数组:
#array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);
如果我删除评论,我会得到很多错误,听起来像是与filemtime路径有关的问题......
array_multisort(array_map('filemtime', $files), SORT_NUMERIC, SORT_DESC, $files);
这是我尝试按filemtime对图像进行排序时遇到的错误。
警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Castellamare_Del_Golfo_16082016_001.jpg 的统计信息失败 警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的Cefalu_14082017_001.jpg的统计信息失败 警告:filemtime():第 84
行 D:\Web\test\www\gallery\gallery.php 中的Cefalu_14082017_002.jpg的统计信息失败警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Charleston_Mondello_04062014_001.jpg stat 失败 警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Charleston_Mondello_15032010_001.jpg stat 失败 警告:filemtime():第 84
行 D:\Web\test\www\gallery\gallery.php 中的 Concerto_Politeama_Palermo_25072015_001.jpg stat 失败警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Foro_Italico_Magnolia_02022014_001.jpg 的统计信息失败 警告:filemtime():第 84 行 D:\Web\test\www\gallery\gallery.php 中的Gattino_08092008_001.jpg的统计信息失败 警告:filemtime():第 84
行 D:\Web\test\www\gallery\gallery.php 中的Mondello_Lido_04062014_001.jpg的统计信息失败警告:第 84 行 D:\Web\test\www\gallery\gallery.php 中的 Mondello_Passeggiata_10092007_001.jpg 的 filemtime():stat 失败 警告:filemtime():第 84
行 D:\Web\test\www\gallery\gallery.php 中的 Riserva_Naturale_Capo_Gallo_02082016_001.jpg 的 stat 失败 警告:filemtime():D:\ 中 Riserva_Naturale_Capo_Gallo_02082016_002.jpg 的 stat 失败Web\test\www\gallery\gallery.php 第 84 行 警告:filemtime():第 84
行 D:\Web\test\www\gallery\gallery.php 中的Terrasini_Scultura_23122018_001.jpg统计失败
并且图像不再显示。
如何修复此错误?听起来像是 Php 的错误。 如果我在没有附加路径的情况下放入并且如果我将所有图像从 移动到 .问题是,如果 scandir 正在处理子文件夹,则排序图像不起作用。我有php 8.1.11 64位和apache 2.4.53 64位。scandir($src_folder);
foto
root/gallery/foto/
root/gallery/
这是一个部分代码,所有完整代码约为 15 kb,这是一个用于测试目的的简短版本......
<?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("\0", "", $page);
$currentPage = (is_numeric($currentPage) && $currentPage > 0)
? htmlspecialchars((int) $currentPage, ENT_QUOTES | ENT_HTML401, 'UTF-8')
: 1;
$currentPage = str_replace("\0", "", $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 ' ';
if ($currentPage > 1) {
$prevPage = $currentPage - 1;
echo '<a href="'. htmlspecialchars($_SERVER['PHP_SELF'], ENT_QUOTES | ENT_HTML401, 'UTF-8') .'?page='. $prevPage .'" class="direction">❰❰</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">❱❱</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("\0", "", $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] .'">'. $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中,用于测试目的的所有文件:
答:
我通过放置一个为 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;
}
最后,我可以使用简单的方法按filemtime对我的图像进行排序,如下所示:
usort($files, 'filetime_callback');
问题是filemtime找不到子文件夹中提供的图像。
谢谢。
评论