【问题标题】:Duplicate filename protection by incrementation通过增量重复文件名保护
【发布时间】:2011-06-29 07:18:48
【问题描述】:

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

【问题讨论】:

    标签: php file duplicates filenames increment


    【解决方案1】:

    此算法不可扩展。上传 n 个同名文件会导致该算法的 O(n) 行为,导致 O(n²) 总运行时间,包括 O(n²) 次文件系统访问。这对于服务器应用程序来说并不好。由于文件系统的工作方式,它也无法修复。

    更好的解决方案:

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

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

    【讨论】:

      【解决方案2】:

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

      例如。在 PHP 中

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

      【讨论】:

        【解决方案3】:

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

        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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-01
          • 2010-12-22
          • 2020-06-04
          • 1970-01-01
          • 2021-11-12
          相关资源
          最近更新 更多