5

我正在使用以下代码为上传的文件生成唯一的文件名

$date = date( 'U' );
$user = $_SERVER[REMOTE_ADDR];
$filename = md5($date.$user);

问题是我想稍后在脚本中再次使用此文件名,但如果脚本需要一秒钟才能运行,我将在第二次尝试使用此变量时获得不同的文件名。

例如,我正在使用上传/调整大小/保存图像上传脚本。脚本的第一个操作是复制并保存调整大小的图像,我使用日期函数为其分配唯一名称。然后脚本处理保存并保存整个上传,并为其分配一个名称。在脚本的末尾($thumb$full是变量),我需要将保存上传时使用的文件名插入到 MySQL 数据库中。

问题是,有时在大图像上需要超过一秒(或在此过程中,秒数发生变化),导致放入数据库的文件名与实际保存的文件名不同。

使用这种命名方法不是一个好主意吗?

4

6 回答 6

5

AFAIK 这是命名文件的好方法,尽管我会检查file_exists()并可能添加一个随机数。

您需要将该文件名存储在一个变量中并稍后再次引用它,而不是每次都依赖于算法。这可以$_SESSION在页面加载之间存储在用户、cookie、GET 变量等中。

希望有帮助

于 2009-08-11T17:24:39.107 回答
2

我建议将文件名存储在会话中(根据 AI)。如果将其存储在其他变量之一中,最终用户更有可能通过它攻击系统。与 rand() 连接的用户的 MD5 将是获取一长串唯一值的好方法。仅使用 rand() 可能会有更高百分比的冲突。

我不确定您上传文件所遵循的过程,但另一种处理文件上传的方法是使用 PHP 的内置处理程序。您可以上传文件,然后使用“安全”方法将上传的文件拉出临时空间。(在这种情况下,临时空间可以安全地位于 open base dir 指令之外,以防止篡改)。is_uploaded_file() 和 move_uploaded_file() 来自:http://php.net/manual/en/features.file-upload.post-method.php示例 2 可能会解决您遇到的问题。

如果您正在动态选择文件名,请务必检查该位置中的现有文件。如果允许用户以任何形式或形式进行输入,请验证并过滤参数以确保其安全。此外,如果存储文件夹可通过 Web 访问,请确保您输入了名称以及可能的扩展名。您不希望有人能够上传代码然后能够执行它。这正式导致不良活动。

于 2009-08-11T17:36:08.537 回答
2

只想添加 php 具有创建标识符的功能:uniqid. 您还可以在标识符前面加上一个字符串(可能是日期?)。

始终验证用户的输入和服务器标头!

于 2009-08-11T17:43:22.283 回答
1

我刚刚发现 PHP 有一个内置函数,称为 tempnam。它甚至可以避免竞争条件。请参阅http://php.net/manual/en/function.tempnam.php

于 2012-05-02T18:36:17.567 回答
0

为什么不使用

$filename = md5(rand());

这在每种情况下都是独一无二的。如果你发现它$filename已经存在,你可以再次调用它。

于 2009-08-11T17:23:25.163 回答
0

使用依赖于时间的 ID 不是一个好主意——如果您同时上传两张图片,后面的一张可以覆盖前面的。您应该查看诸如uniqid()之类的函数。但是,如果这个上传/调整大小/保存脚本是“单用户”的,那么这不是一个大问题。

到问题本身。如果我是你,我只会将计算的文件名保存到某个变量中,然后使用该变量。已经计算的计算是浪费时间。而当上传一些非常大的图像,或者一次上传更多图像时,脚本甚至可能需要 20 秒。你不能相信你会在一秒钟内做出你想要的一切。

于 2009-08-11T23:30:55.110 回答