4

我试图允许用户通过 PHP 网站上传文件。由于所有文件都保存在服务器上的单个文件夹中,因此可以想象(尽管概率很低)两个不同的用户可以上传两个文件,虽然它们不同,但名称完全相同。或者它们可能是完全相同的文件。

在这两种情况下,我想exec("openssl md5 " . $file['upload']['tmp_name'])在文件上传后立即使用它来确定文件的 MD5 哈希值。然后,我将检查数据库中是否存在任何相同的 MD5 哈希,如果找到,我将不会完成上传。

但是,在move_uploaded_file文档中,我发现了这条评论:

警告:如果您将 md5_file 哈希保存在数据库中以记录上传的文件,这有助于防止用户两次上传相同的文件,请注意使用 move_uploaded_file 后 md5_file 哈希会更改!当文件被删除时,您无法在数据库中找到相应的哈希并将其删除。

真的是这样吗?将 tmp 目录中的文件移动到永久位置后,它的 MD5 哈希值是否会发生变化?我不明白为什么会这样。无论如何,是否有另一种更好的方法来确保同一文件不会多次上传到文件系统?

4

5 回答 5

1

你不应该用exec("openssl md5 " . $file['upload']['name'])名字来代替吗?我认为临时名称因上传而异。

于 2011-11-24T21:26:20.410 回答
1

看来确实是这样。我也很快浏览了文档。但是为什么在使用之前不共享 md5 校验move_uploaded_file和并将该值存储在数据库中,直接将其与新文件链接?那就是您可以随时检查上传的文件以及该文件是否已存在于您的文件系统中。

这确实需要一个数据库,但大多数人都可以访问一个。

于 2011-11-24T21:28:46.450 回答
1

如果您对答案中给出的所有理由深信不疑,并决定根本不使用 md5(我仍然不确定您是否想要或必须使用哈希),您可以为每个用户附加一些独特的内容,然后上传到每个文件名的时间。这样,您最终将获得更具可读性的文件名。类似的东西:$filename = "$filename-$user_ip_string-$microtime";。当然,您必须在此之前准备好所有三个变量并对其进行格式化,这是不言而喻的。

不可能同时出现相同的文件名、相同的 IP 地址和相同的微时间,对吧?你可以很容易地只使用微时间,但 IP 会让它更加确定。当然,就像我说的那样,如果您决定不使用散列并寻求更简单的解决方案,这一切都会过去。

于 2011-11-24T21:46:33.437 回答
1

尝试将上传的文件重命名为唯一 ID。用这个:

$dest_filename = $filename;
        if (RENAME_FILE) {
      $dest_filename = md5(uniqid(rand(), true)) . '.' . $file_ext;
         }

让我知道它是否有帮助:)

于 2012-12-04T22:41:10.650 回答
0

不,一般来说,move_uploaded_file 不会神奇地改变哈希值。

但是,如果您计算包含文件路径的 md5(),那么如果文件移动到新路径/文件夹,哈希值肯定会发生变化。

如果你 md5() 文件名,什么都不会改变。

使用唯一名称重命名上传的文件是个好主意。

但是不要忘记找到最终存储文件的文件,它位于vHost的文档根文件夹之外。它位于那里,如果不使用 PHP 脚本就无法下载。

最后的评论:虽然这不太可能,但两个不同文件的md5 散列可能是相同的。

于 2011-11-24T21:32:00.937 回答