【问题标题】:Best method to generate unique filenames when uploading files PHP [duplicate]上传文件PHP时生成唯一文件名的最佳方法[重复]
【发布时间】:2011-05-21 07:01:47
【问题描述】:

任何人都可以建议为文件上传生成唯一文件名以避免重复的最佳做法 参赛作品?

提前致谢。

【问题讨论】:

  • 最安全的方法是增量计数器。
  • @Pekka 我如何使用计数器上传图片
  • 使用它作为文件名并在末尾添加扩展名。这是 .jpg 图像的示例: hash('ripemd160',time().mt_rand(10,1000)).".jpg" 所以它基本上是以秒为单位的 unix 时间,+ 10 到 1000 之间的随机数,然后是全部编码成哈希字符串

标签: php image upload unique identifier


【解决方案1】:

类似这样的:

$filename = md5(date('Y-m-d H:i:s:u'));

由于不保证 MD5 哈希值是唯一的,因此最好使用 file_exists($filename) 检查冲突。在这种情况下,请重新运行上述内容。

【讨论】:

  • 哈希不是唯一的。
  • @afilina 为什么哈希不是唯一的?
  • 有可能与 MD5 或任何散列函数发生冲突,但这对于大多数用例来说不太可能。我最初的回复来自 2010 年。使用 sha256,碰撞的可能性非常非常低stackoverflow.com/questions/4014090/…
  • @JamesP。将哈希想象为电影的一次句子摘要。多部电影可以有相同的摘要。
  • 建议的代码$filename = md5(date('Y-m-d H:i:s:u')); 似乎不起作用。来自 PHP 文档:“请注意 date() 将始终生成 000000,因为它需要一个整数参数”测试:echo date('Y-m-d H:i:s:u'); 输出:2019-03-22 07:30:28:000000 更好的解决方案是:$date = DateTime::createFromFormat('U.u', microtime(TRUE)); $filename = md5($date->format('Y-m-d H:i:s:u')));
【解决方案2】:

您可以使用文件上传时的 unix 时间戳。如果您希望同时进行多个上传,您可以附加一个唯一的用户 ID 或原始文件名的一部分。

【讨论】:

  • 好主意,microtime() 非常适合单个用户案例。
【解决方案3】:

此功能可能会有所帮助:

http://php.net/manual/en/function.uniqid.php

您也可以考虑使用文件内容的哈希值,例如:

http://php.net/manual/en/function.sha1-file.php

【讨论】:

  • 使用哈希作为文件名时要小心冲突。最好使用用随机字符串加盐的哈希。
【解决方案4】:

tempnamtmpfile,如果你想创建文件,或者this question

【讨论】:

    【解决方案5】:

    $username.$timestamp.$randomNumber

    或者,如果您不想让人们知道上传时间和上传者的详细信息,您也可以对此进行散列

    【讨论】:

      【解决方案6】:

      我通常使用 uniqid() 函数为文件名创建一个 UID,或者使用上传文件的用户名创建一个文件夹并保留原始文件名。第一个的缺点是您必须将原始文件名保存在某个地方才能显示给用户。

      【讨论】:

        猜你喜欢
        • 2012-01-23
        • 1970-01-01
        • 2010-12-08
        • 2016-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-28
        相关资源
        最近更新 更多