通过增量复制文件名保护

问题描述 投票:2回答:3

问题是将文件上传保存在本地,并试图找到一种处理重复文件名的好方法。

php file duplicates filenames increment
3个回答
3
投票

此算法不可扩展。上载具有相同名称的n文件将导致此算法中的O(n)行为,从而导致O(n²)总运行时间,包括O(n² )文件系统访问。对于服务器应用程序来说,这不是一个好主意。由于文件系统的工作原理,它也无法修复。

更好的解决方案:

  1. 存储已在数据库表中使用的文件名,将它们映射到其使用计数。
  2. 在文件名中添加高粒度时间戳。
  3. 使用内容的SHA1(或MD5)哈希作为文件名。如果重要的话,这也可以防止重复的文件被上传。

[如有必要,使用数据库将文件名映射回人类可读的名称。


1
投票

最佳解决方案是将时间戳记以YYYYDDMMHHMMSS的形式附加,一生中不会出现冲突;)而且它的时间复杂度非常小。您可以做的另一件事..您可以直接跳过名称检查,而使用文件名ex代替。“ 1.jpg”(如果正在上传)只需附加1(timestamp).jpg,这样您甚至不需要遍历文件系统。希望对您有所帮助

例如在PHP中

 $timestamp=date("YmdGis"); 
it will generate something like
20111122193631
;)

0
投票

我已经制定了自己的解决方案。这是:

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;
© www.soinside.com 2019 - 2024. All rights reserved.