我有一个用户输入数据并上传图像的表单。如果使用md5散列的图像完全相同,将检查此图像。上传的每个图像都有自己的md5哈希码。如果用户决定上传与服务器上的图像完全相同的图像,则不会移动该图像。相反,在创建条目时,图像将从具有相同哈希码的不同条目继承该文件的名称。但是我的当前代码遇到了几个问题。例如,当用户第一次上传图像时,没有哈希码。我遇到的另一个问题是,即使我上传的图像具有相同的哈希码,图像的名称也会变为uniqid。它正在执行else块而不是if块。
这是我的代码:
PHP
if (isset($_POST["pageNum"], $_FILES["image"], $_POST["subtitle"], $_POST["text"]))
{
$page = $_POST["pageNum"];
$url = $_SESSION["articleUrl"];
$subtitle = filter_data($_POST["subtitle"]);
$text = filter_data($_POST["text"]);
$name = $_FILES["image"]["name"];
$tempName = $_FILES["image"]["tmp_name"];
$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
$hash = md5_file($target_file);
$resultHash = $db->query("SELECT * COUNT(*) FROM `Stories` WHERE hash = '$hash' LIMIT 1");
if ($resultHash->num_rows > 0)
{
$row = $resultHash->fetch_array();
$name = $row["image"];
}
else
{
if (@getimagesize($target_file) == true)
{
$ext = pathinfo($name, PATHINFO_EXTENSION);
$name = basename($name, "." . $ext);
$name = $name . uniqid() . "." . $ext;
$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
}
move_uploaded_file($tempName, $target_file);
}
$result = $db->query("SELECT * FROM Stories WHERE page = '$page' AND url = '$url'");
if ($result->num_rows == 0)
{
$db->query("INSERT INTO `Stories` (`image`, `text`, `url`, `subtitle`, `page`, `hash`) VALUES ('$name', '$text', '$url', '$subtitle', '$page', '$hash')");
}
else
{
$db->query("UPDATE Stories SET image = '$name', text = '$text', url = '$url', subtitle = '$subtitle', page = '$page', hash = '$hash' WHERE url = '$url' AND page = '$page'");
}
}
答案 0 :(得分:0)
下面的行是有问题的,因为如果$target_file
已经存在,您将只获得哈希值。如果没有该名称的文件,则没有任何内容可以散列,并且您无法获得与数据库值进行比较的哈希值。
$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
$hash = md5_file($target_file);
第一行没用;去掉它。您应该计算新上传文件的哈希值,因为这需要与存储在数据库中的哈希值进行比较:
$hash = md5_file($tempName);
稍后,您还需要更改getimagesize
检查以使用新上传的文件,因为这是需要处理的文件(我们将检查这是否是一个新的唯一文件):
if (getimagesize($tempName) == true)