2016-07-22 15 views
0

사용자가 데이터를 입력하고 이미지를 업로드하는 양식이 있습니다. 이 이미지는 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'"); 
     } 

    } 

답변

0

$target_file이 이미 존재하는 경우에만 해시를 얻을 수 있기 때문에 아래의 라인에 문제가있는 :

여기 내 코드입니다. 해당 이름의 파일이 없으면 해시 할 것이 없으며 DB 값과 비교할 해시를 얻을 수 없습니다.

$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name"; 
$hash = md5_file($target_file); 

첫 줄은 쓸모가 없습니다. 그것을 제거하십시오.

$hash = md5_file($tempName); 

나중에, 당신은 또한 새로 업로드와 함께 작동 할 수 getimagesize 수표를 변경해야하는가 DB에 저장된 해시와 비교 될 필요가 무엇을 대신 때문에 새로 업로드 된 파일의 해시를 계산한다 내가 처음으로 이미지를 업로드 할 때

if (getimagesize($tempName) == true) 
+0

의 getimagesize 일부에 대해 호출되고이 처리해야하는 파일이기 때문에 (우리는이 새로운 고유 한 파일 인 경우이 체크에 도착) 파일 이유 (파일이 서버에 없더라도). 또한 동일한 이미지를 두 번 업로드하면 해시 이름이있는 행이 있는지를 확인하는 if 블록이 호출되지 않습니다. – user2896120

+0

첫 번째 게시 이후 몇 가지 사항을 변경했습니다. 최신 권장 사항을 다시 테스트 해 주시겠습니까? 주요 장소에서 일부 "echo"또는 "vardump"호출을 추가하면 PHP가 실행 중에 무엇을보고 있는지 알 수 있습니다. – BeetleJuice

+0

그래도 변경 사항이 있어도 동일한 결과가 나타납니다. getimagesize에서 $ tempName 대신 $ target_file을 사용할 때, 올바르게 작동하고 처음 업로드 할 때 이미지 이름을 변경하지 않습니다. – user2896120