上传文件PHP时生成唯一文件名的最佳方法[重复]

Posted

技术标签:

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

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

提前致谢。

【问题讨论】:

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

类似这样的:

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

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

【讨论】:

哈希不是唯一的。 @afilina 为什么哈希不是唯一的? 有可能与 MD5 或任何散列函数发生冲突,但这对于大多数用例来说不太可能。我最初的回复来自 2010 年。使用 sha256,碰撞的可能性非常非常低***.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,或者使用上传文件的用户名创建一个文件夹并保留原始文件名。第一个的缺点是您必须将原始文件名保存在某个地方才能显示给用户。

【讨论】:

以上是关于上传文件PHP时生成唯一文件名的最佳方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

避免上传文件时出错的最佳方法

在服务器上存储图像的最佳实践

PHP生成唯一ID的三种方法

将整个PHP数组散列成唯一值[重复]

使用 PHP 创建单文件上传表单的最佳方法是啥?

CakePHP 上传文件的最佳实践