사용자가 데이터를 입력하고 이미지를 업로드하는 양식이 있습니다. 이 이미지는 md5 해싱을 사용하여 정확히 동일한 이미지가 있는지 확인합니다. 업로드 된 각 이미지에는 자체 md5 해시 코드가 있습니다. 사용자가 서버에있는 것과 정확하게 같은 이미지를 업로드하기로 결정하면 해당 이미지는 이동되지 않습니다. 대신 항목을 만들 때 이미지는 동일한 해시 코드를 사용하여 다른 항목에서 해당 파일의 이름을 상속합니다. 하지만 현재 코드에 몇 가지 문제가 있습니다. 하나는 사용자가 처음으로 이미지를 업로드 할 때 해시 코드가없는 것입니다. 내 코드에서 겪고있는 또 다른 문제는 동일한 해시 코드로 이미지를 업로드 할 때도 이미지의 이름이 uniqid로 변경된다는 것입니다. if 블록이 아닌 else 블록을 실행 중입니다.서버에서 이미지 중복 방지
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'");
}
}
의 getimagesize 일부에 대해 호출되고이 처리해야하는 파일이기 때문에 (우리는이 새로운 고유 한 파일 인 경우이 체크에 도착) 파일 이유 (파일이 서버에 없더라도). 또한 동일한 이미지를 두 번 업로드하면 해시 이름이있는 행이 있는지를 확인하는 if 블록이 호출되지 않습니다. – user2896120
첫 번째 게시 이후 몇 가지 사항을 변경했습니다. 최신 권장 사항을 다시 테스트 해 주시겠습니까? 주요 장소에서 일부 "echo"또는 "vardump"호출을 추가하면 PHP가 실행 중에 무엇을보고 있는지 알 수 있습니다. – BeetleJuice
그래도 변경 사항이 있어도 동일한 결과가 나타납니다. getimagesize에서 $ tempName 대신 $ target_file을 사용할 때, 올바르게 작동하고 처음 업로드 할 때 이미지 이름을 변경하지 않습니다. – user2896120