我正在尝试允许用户通过PHP网站上传文件。由于所有文件都保存在服务器上的单个文件夹中,因此可以想象(尽管可能性很低)两个不同的用户可以上传两个文件,这些文件虽然不同,但命名完全相同。或者它们可能是完全相同的文件。
在这两种情况下,我都想使用exec("openssl md5 " . $file['upload']['tmp_name'])
在文件上传后立即确定MD5哈希值。然后我会检查数据库中是否存在任何相同的MD5哈希,如果找到,我将无法完成上传。
但是,在move_uploaded_file
文档中,我发现了这条评论:
警告:如果在数据库中保存md5_file哈希来保存上传文件的记录,这对于防止用户上传同一文件两次很有用,请注意在使用move_uploaded_file后md5_file哈希值会发生变化!当删除文件时,您无法找到相应的哈希值并将其删除。
这是真的吗? 将tmp目录中的文件的MD5哈希值移动到永久位置后是否会发生变化?我不明白为什么会这样。无论如何,还有另一种更好的方法可以确保同一文件不会多次上传到文件系统吗?
答案 0 :(得分:1)
您不应该使用exec("openssl md5 " . $file['upload']['name'])
名称吗?我认为临时名称与上传到上传不同。
答案 1 :(得分:1)
看来确实如此。我很快就一直在浏览文档。但是为什么不使用move_uploaded_file
在之前共享md5校验和并将该值存储在数据库中直接将其与新文件链接?那就是你总是可以检查上传的文件以及文件系统中是否已存在该文件。
这确实需要一个数据库,但大多数都可以访问一个数据库。
答案 2 :(得分:1)
如果您对答案中给出的所有原因深信不疑并且决定不使用md5(我仍然不确定您是否想要或者必须使用哈希),您可以为每个添加一些独特的东西用户和上传到每个文件名的时间。这样你最终会得到更可读的文件名。类似于:$filename = "$filename-$user_ip_string-$microtime";
。当然,在此之前你必须准备好所有三个变量并进行格式化,不言而喻。
同一时间没有相同文件名,相同IP地址和相同微缩时的机会,对吧?你可以轻松地使用microtime,但IP会让它更加确定。 当然,正如我所说,如果您决定不使用散列并寻求更简单的解决方案,那么所有这一切都将成为现实。
答案 3 :(得分:1)
尝试将上传的文件重命名为唯一ID。 使用此:
$dest_filename = $filename;
if (RENAME_FILE) {
$dest_filename = md5(uniqid(rand(), true)) . '.' . $file_ext;
}
让我知道它是否有帮助:)
答案 4 :(得分:0)
不,一般情况下,散列不会被move_uploaded_file以某种方式神奇地改变。
但是,如果你计算包含文件路径的md5(),那么如果文件移动到新的路径/文件夹,散列肯定会改变。
如果您使用md5()文件名,则不会有任何更改。
使用唯一名称重命名上传的文件是个好主意。
但不要忘记找到文件以最终存储文件,在您的vHost的文档根文件夹之外。位于那里,不使用PHP脚本就无法下载。
最后评论:虽然非常不太可能,但两个不同文件的 md5哈希 可能相同。