通过增量保护重复文件名

发布于 2024-10-17 15:58:14 字数 39 浏览 4 评论 0原文

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

The issue was saving file uploads locally, and trying to find a nice way to handle duplicate file names.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

渔村楼浪 2024-10-24 15:58:14

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

更好的解决方案:

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

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

This algorithm is not scalable. Uploading n files with the same name will cause O(n) behavior in this algorithm, leading to O(n²) total running time, including O(n²) filesystem accesses. That's not pretty for a server app. It also can't be fixed because of how filesystems work.

Better solutions:

  1. Store filenames that have already been used in a DB table, mapping them to their use count.
  2. Put a high-granularity timestamp in the filename.
  3. Use the SHA1 (or MD5) hash of the contents as the filename. This also prevents duplicate files being uploaded, if that's important.

Use a database to map filenames back to human-readable names, if necessary.

小苏打饼 2024-10-24 15:58:14

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

前。在 PHP 中

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

Best solution is just attach Time Stamp in form of YYYYDDMMHHMMSS , You won't get conflicts throughout your whole life ;)
Also its Time complexity is very less.
Another thing you can do .. you might skip name check directly and instead with file's name ex.
"1.jpg" if you are uploading
just attach 1(timestamp).jpg , so that you don't even need to iterate through file system. hope it helps

ex. in PHP

 $timestamp=date("YmdGis"); 
it will generate something like
20111122193631
;)
握住我的手 2024-10-24 15:58:14

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

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;

I've made my own solution. Here it is:

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;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文