问题是将文件上传保存在本地,并试图找到一种处理重复文件名的好方法。
此算法不可扩展。上载具有相同名称的n文件将导致此算法中的O(n)行为,从而导致O(n²)总运行时间,包括O(n² )文件系统访问。对于服务器应用程序来说,这不是一个好主意。由于文件系统的工作原理,它也无法修复。
更好的解决方案:
[如有必要,使用数据库将文件名映射回人类可读的名称。
最佳解决方案是将时间戳记以YYYYDDMMHHMMSS的形式附加,一生中不会出现冲突;)而且它的时间复杂度非常小。您可以做的另一件事..您可以直接跳过名称检查,而使用文件名ex代替。“ 1.jpg”(如果正在上传)只需附加1(timestamp).jpg,这样您甚至不需要遍历文件系统。希望对您有所帮助
例如在PHP中
$timestamp=date("YmdGis");
it will generate something like
20111122193631
;)
我已经制定了自己的解决方案。这是:
function recursive_increment_filename ($path, $filename)
{
$test = "{$path}/{$filename}";
if (!is_file($test)) return $test;
$file_info = pathinfo($filename);
$part_filename = $file_info['filename'];
if (preg_match ('/(.*)_(\d+)$/', $part_filename, $matches))
{
$num = (int)$matches[2] +1;
$part_filename = $matches[1];
}
else
{
$num = 1;
}
$filename = $part_filename.'_'.$num;
if (array_key_exists('extension', $file_info))
{
$filename .= '.'.$file_info['extension'];
}
return recursive_increment_filename($path, $filename);
}
$url = realpath(dirname(__FILE__));
$file = 'test.html';
$fn = recursive_increment_filename($url, $file);
echo $fn;