上载PHP文件时生成唯一文件名的最佳方法
有谁能建议为文件上载生成唯一的文件名以避免重复的最佳做法吗 参赛作品上载PHP文件时生成唯一文件名的最佳方法,php,image,upload,unique,identifier,Php,Image,Upload,Unique,Identifier,有谁能建议为文件上载生成唯一的文件名以避免重复的最佳做法吗 参赛作品 提前感谢。您可以使用文件上载时的unix时间戳。如果希望同时进行多个上载,则可以附加唯一的用户ID或原始文件名的一部分。我通常使用uniqid()函数为文件名创建UID,或者使用上载文件的用户名创建文件夹并保留原始文件名。第一种方法的缺点是,您必须将原始文件名保存在某个位置以显示给用户。$username.$timestamp.$randomNumber 或者,如果您不想让人们知道该文件的上传时间和上传人的详细信息,您也可以将
提前感谢。您可以使用文件上载时的unix时间戳。如果希望同时进行多个上载,则可以附加唯一的用户ID或原始文件名的一部分。我通常使用uniqid()函数为文件名创建UID,或者使用上载文件的用户名创建文件夹并保留原始文件名。第一种方法的缺点是,您必须将原始文件名保存在某个位置以显示给用户。$username.$timestamp.$randomNumber
或者,如果您不想让人们知道该文件的上传时间和上传人的详细信息,您也可以将其散列,如果您想创建文件,或者。此函数可能有助于:
您还可以考虑使用文件内容的散列,例如:
类似这样的内容:$filename = md5(date('Y-m-d H:i:s:u'));
由于MD5哈希不能保证是唯一的,所以最好使用file_exists($filename)检查冲突。在这种情况下,请重新运行上述操作。最安全的方法是使用递增计数器。@Pekka如何使用计数器上载图像?将其用作文件名并在末尾添加扩展名。这里有一个.jpg图像的例子:hash('ripemd160',time().mt_rand(101000))。.jpg“,所以它基本上是unix时间,以秒为单位,+一个10到1000之间的随机数,然后它都被编码到一个hash字符串中,当使用hash作为文件名时要小心冲突。最好使用带有随机字符串的散列。好主意,microtime()对于单用户情况非常好。散列不是唯一的。@afilina为什么散列不是唯一的?可能会与MD5或任何散列函数发生冲突,但大多数情况下不太可能。我最初的回应是从2010年开始的。使用sha256,碰撞的可能性非常非常低@JamesP。把散列想象成电影的一句话摘要。多部电影可以有相同的摘要。建议的代码
$filename=md5(日期('Y-m-d H:i:s:u')代码>似乎不起作用。在PHP文档中:“注意date()将始终生成000000,因为它需要一个整数参数”Test:echo date('Y-m-dh:i:s:u')代码>输出:2019-03-22 07:30:28:000000
更好的解决方案是:$date=DateTime::createFromFormat('U.U',microtime(TRUE))$filename=md5($date->format('Y-m-dh:i:s:u'))代码>