上传时生成唯一的PHP文件名

9

我在我的网站上有一个带有图片上传的提交讨论表单。现在,我想在用户提交他们的图片时上传一个唯一的文件名,这样我就可以展示所有图片的结果并避免重复的文件名。

我该如何用php实现这个功能?如果需要我的表单处理代码,我可以上传它。


1
http://stackoverflow.com/questions/8551763/storing-image-data-in-mysql-and-naming-conventions/8551813#8551813 - Richard
1
使用 uniqid() 为永久文件命名,并使用 move_uploaded_file() 进行上传。 - Michael Berkowski
5个回答

12
你可以使用 uniqid() 函数生成一个唯一的 ID。
/**
 * Generate a unique ID
 * @link http://www.php.net/manual/en/function.uniqid.php
 * @param prefix string[optional] <p>
 * Can be useful, for instance, if you generate identifiers
 * simultaneously on several hosts that might happen to generate the
 * identifier at the same microsecond.
 * </p>
 * <p>
 * With an empty prefix, the returned string will
 * be 13 characters long. If more_entropy is
 * true, it will be 23 characters.
 * </p>
 * @param more_entropy bool[optional] <p>
 * If set to true, uniqid will add additional
 * entropy (using the combined linear congruential generator) at the end
 * of the return value, which should make the results more unique.
 * </p>
 * @return string the unique identifier, as a string.
 */
function uniqid ($prefix = null, $more_entropy = null) {}

9

你可以在日期中使用时间戳,这样你就不会得到相同的文件名/时间了。

不确定你的代码是什么样子的,但你可以像这样做:

$filename = uniqid() . $orig_filename;
阅读关于uniqid的PHP文档以获取更多信息。它使用日期时间来输出一个唯一标识符字符串。

抱歉,你能给我一些例子吗? - Umme Habiba Kanta
好的,它将带有唯一ID的名称更改为数据库,类似于4eef63add36881162_03.JPG。但在图像文件夹中,它显示原始图像名称,例如:1162_03.jpg,我能否将原始图像名称更改为与数据库图像名称完全相同的名称? - Umme Habiba Kanta
我解决了这个问题。谢谢你的时间,Batkins。 - Umme Habiba Kanta
一旦您将图片放在了想要的位置并获取了唯一ID,您可以使用该唯一ID来重命名它。$NewName = uniqid() . $orig_filename; rename('folder/' . $_FILES["PicUpload"]["name"], "folder/$NewName"); - David Myers

3
如果您需要一个唯一的名称,可以使用 uniqid
$filename = uniqid() . '.jpeg';

请注意,虽然UUID在一台机器上是唯一的,但如果您在两台不同的计算机上同时运行,则可能生成相同的UUID。


+1 对于“但要注意,它只在一台机器上是唯一的,即如果您在两台不同的机器上同时运行它,它可能会生成相同的结果。” - Tilak Raj

1

在我看来,最好的选择是使用sha1_file。它将根据文件内容创建唯一的哈希值。只有当它是相同的图像或哈希碰撞时才会发生冲突,这是2^160中的1次机会。通过这种方式,您可以避免重复的图像,但由于您正在从文件中创建哈希,因此可能会变慢。

$filename = sha1_file($upload_file) . $ext;


另一种选择是tempnam。它将创建一个具有唯一名称的临时文件。

注意:如果PHP无法在指定的dir参数中创建文件,则会退回到系统默认值。

基本示例:

$filename = tempnam($dir, $prefix);
unlink($filename)//we don't need the tempfile just the name

还要注意:如果您更改文件名,它可能不是唯一的。


0

我认为最简单的方法是将图像名称存储在数据库字段中,然后在用户上传图像时通过检查现有文件名来验证文件名是否唯一。如果您不希望用户等待表单提交后才能获得错误或提示更改文件名,则可以使用ajax / jquery接口。


你说的更好的方式是什么意思?我认为要么按照其他评论中建议的使用 unique_id,要么让用户命名他们的文件是两种最好的方式。如果您计划向客户显示名称,则更好的方法是允许用户使用用户友好的名称来命名他们的文件,否则您将向客户显示 unique_id,这可能不合适。 - Robert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接