PHP 命名后无法在 DIR 中找到第一个文件 'original.jpg'
PHP Can't Find First File In DIR When It's Named 'original.jpg'
我有一个简单的函数,它 return 是要显示的有效图像路径。它传递了为我的数据库中的特定行存储的 URL 。基本功能是:
- 如果 URL 有一个尾部斜线,它是一个目录; return 该目录中的第一个文件。如果没有,return "default image"
- 如果URL是一张图片,看是否存在,否则使用第一条规则。
它工作得很好,除非文件夹只包含一个名为 'original.jpg' 的文件,它会显示默认图像。如果我添加另一个文件,它可以使用 'original.jpg'。如果我将其重命名为 'original.jpeg' 或 'ori.jpg'(或更短的名称),它就可以工作。这是我遇到的唯一一个以这种方式运行的文件名。
function displayFile($file){
$imgPath = "./img/path/";
// If folder was specified or file doesn't exists; use first available file
if( substr($file, -1) == '/' || !file_exists($imgPath . $file) ){
// Extract base path
$file = strstr( $file, '/', true );
$handle = opendir($imgPath . $file);
$entry = readdir($handle);
$firstFile = '';
while (false !== ($entry = readdir($handle))) {
if( substr($entry, 0, 1) != '.' ){
$firstFile = $entry;
break; // This break isn't the problem
}
}
// No file found; use default
if( $firstFile == '' ){ return $imgPath . "paw.png"; }
// Found a file to use
else{ return $imgPath . $file . '/' . $firstFile; }
} else {
// File name is valid; use it
return $imgPath . $file;
}
closedir($imgPath);
}
您执行了许多不必要的操作来检索文件。
这是您的函数的修改版本,它应该按预期工作并且很短:
function displayFile($entry) {
$imgPath = "./img/path/";
$entry = implode('/', explode('../', $entry));
$path = $imgPath.$entry;
switch(true) {
case is_file($path) :
return $path;
break;
case (is_dir($path) AND !is_file($path)) :
$files = array_filter(glob($path."/*"), 'is_file');
if(!empty($files)) {
return $path . basename(array_values($files)[0]);
}
break;
}
return $imgPath . 'paw.png';
}
您调用了两次 readdir,基本上总是跳过第一个条目。
$entry = readdir($handle);
删除该行,您应该可以开始了。
@knrdk 是绝对正确的,但要解释看似不稳定的行为:它有时起作用而不是其他原因的原因是排序。将函数缩小到:
function displayFile($file){
$imgPath = "./img/path/";
$file = strstr( $file, '/', true );
$handle = opendir($imgPath . $file);
$entry = readdir($handle);
while (false !== ($entry = readdir($handle))) {
echo $entry . ' ';
}
closedir($imgPath);
为了说明行为
/* folder/[1.jpg] */
displayFile('folder'); // Output: . 1.jpg
/* folder/[original.jpg] */
displayFile('folder'); // Output: . ..
/* folder/[original.jpeg] */
displayFile('folder'); // Output: original.jpg .
// Not entirely sure why that's different, but there it is
/* folder/[1.jpg, original.jpg] */
displayFile('folder'); // Output: original.jpg .. .
我有一个简单的函数,它 return 是要显示的有效图像路径。它传递了为我的数据库中的特定行存储的 URL 。基本功能是:
- 如果 URL 有一个尾部斜线,它是一个目录; return 该目录中的第一个文件。如果没有,return "default image"
- 如果URL是一张图片,看是否存在,否则使用第一条规则。
它工作得很好,除非文件夹只包含一个名为 'original.jpg' 的文件,它会显示默认图像。如果我添加另一个文件,它可以使用 'original.jpg'。如果我将其重命名为 'original.jpeg' 或 'ori.jpg'(或更短的名称),它就可以工作。这是我遇到的唯一一个以这种方式运行的文件名。
function displayFile($file){
$imgPath = "./img/path/";
// If folder was specified or file doesn't exists; use first available file
if( substr($file, -1) == '/' || !file_exists($imgPath . $file) ){
// Extract base path
$file = strstr( $file, '/', true );
$handle = opendir($imgPath . $file);
$entry = readdir($handle);
$firstFile = '';
while (false !== ($entry = readdir($handle))) {
if( substr($entry, 0, 1) != '.' ){
$firstFile = $entry;
break; // This break isn't the problem
}
}
// No file found; use default
if( $firstFile == '' ){ return $imgPath . "paw.png"; }
// Found a file to use
else{ return $imgPath . $file . '/' . $firstFile; }
} else {
// File name is valid; use it
return $imgPath . $file;
}
closedir($imgPath);
}
您执行了许多不必要的操作来检索文件。
这是您的函数的修改版本,它应该按预期工作并且很短:
function displayFile($entry) {
$imgPath = "./img/path/";
$entry = implode('/', explode('../', $entry));
$path = $imgPath.$entry;
switch(true) {
case is_file($path) :
return $path;
break;
case (is_dir($path) AND !is_file($path)) :
$files = array_filter(glob($path."/*"), 'is_file');
if(!empty($files)) {
return $path . basename(array_values($files)[0]);
}
break;
}
return $imgPath . 'paw.png';
}
您调用了两次 readdir,基本上总是跳过第一个条目。
$entry = readdir($handle);
删除该行,您应该可以开始了。
@knrdk 是绝对正确的,但要解释看似不稳定的行为:它有时起作用而不是其他原因的原因是排序。将函数缩小到:
function displayFile($file){
$imgPath = "./img/path/";
$file = strstr( $file, '/', true );
$handle = opendir($imgPath . $file);
$entry = readdir($handle);
while (false !== ($entry = readdir($handle))) {
echo $entry . ' ';
}
closedir($imgPath);
为了说明行为
/* folder/[1.jpg] */
displayFile('folder'); // Output: . 1.jpg
/* folder/[original.jpg] */
displayFile('folder'); // Output: . ..
/* folder/[original.jpeg] */
displayFile('folder'); // Output: original.jpg .
// Not entirely sure why that's different, but there it is
/* folder/[1.jpg, original.jpg] */
displayFile('folder'); // Output: original.jpg .. .