目前我正在开发媒体上传系统。 当用户上传文件时,我希望系统自动检查该文件是否已经存在,如果是,则将(x)添加到基本名称。
DSC_2193.jpg
将成为DSC_2193 (1).jpg
DSC_2193 (2).jpg
将成为DSC_2193 (3).jpg
所以我想出了以下功能:
<?php
private function setFileName($path)
{
if (file_exists($path)) {
$file = pathinfo($path);
if (preg_match('/\(([0-9]+)\).' . $file['extension'] . '/', $file['basename'], $matches)) {
return $this->setFileName($file['dirname'] . '/' . preg_replace_callback('/\(([0-9]+)\).' . $file['extension'] . '/', function($matches)
{
return '(' . ($matches[1] + 1) . ')';
}, $file['basename']) . '.' . $file['extension']);
} else {
$basename = substr(basename($path, $file['extension']), 0, -1);
$basename .= ' (1).' . $file['extension'];
return $this->setFileName($file['dirname'] . '/' . $basename);
}
}
else
return $path;
}
?>
现在我想知道:这是否是实现这一目标的正确方法?如果不是:也许有人可以提出更好的选择。如果这是最有效的方式,也许有人可以从中受益。
答案 0 :(得分:0)
您可以使用while
周期轻松完成。这是简单的划痕:
private function setFileName($path)
{
$file = pathinfo($path);
if (file_exists($path)) {
$i = 1;
while (file_exists($file['filename'] . ' (' . $i . ').' . $file['extension'])) $i++;
$filename = $file['filename'] . ' (' . $i . ').' . $file['extension']; // don't know if you want also directory path
}
else
$filename = $file['filename'] . '.' . $file['extension'];
// some code to rename/move_uploaded_file...
}
如果你设置了$filename
(move_uploaded_file
,或只是return $filename
),我不知道你想要什么,所以剩下的代码由你决定。