PHP防止用户上传同一个文件两次的机制

标签 php file-upload md5 md5-file

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

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

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

Warning: If you save a md5_file hash in a database to keep record of uploaded files, which is usefull to prevent users from uploading the same file twice, be aware that after using move_uploaded_file the md5_file hash changes! And you are unable to find the corresponding hash and delete it in the database, when a file is deleted.

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

最佳答案

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

不可能同时出现相同的文件名、相同的 IP 地址和相同的微时间,对吗?您可以轻松地只使用微时间,但 IP 将使它更加确定。 当然,就像我说的,如果您决定不使用散列并寻求更简单的解决方案,那么这一切都会发生。

关于PHP防止用户上传同一个文件两次的机制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262610/

相关文章:

ios - 应用程序的 iTunesConnect 加密

php - 安全地散列密码 - 这么多相互矛盾的建议!

linux - 比较两个目录的相等性

php - PHP 中准备好的 SQL 语句不更新 MySQL 数据库行

PHP 非法偏移类型

c# - WebAPI 上传错误。 MIME 多部分流的预期结束。 MIME 多部分消息不完整

javascript - Dropzone.js 无法在 Windows 上上传文件

javascript - 如何将 this.score 传输到文本文件以获得高分列表? ( Ajax )

php - 如何从具有相同键和值的两个数组中删除值?

python - 使用 Google App Engine Python 将大文件上传到 Google Drive 时出现 400 错误请求