2016-07-22 15 views
0

私は、ユーザーがデータを入力してイメージをアップロードするフォームを持っています。このイメージは、md5ハッシュを使ってまったく同じイメージがあるかどうかチェックされます。アップロードされる各画像には独自のmd5ハッシュコードがあります。ユーザーがサーバー上のイメージとまったく同じイメージをアップロードすることを決定した場合、そのイメージは移動されません。代わりに、エントリを作成するとき、イメージは同じハッシュコードを持つ異なるエントリからそのファイルの名前を継承します。しかし、私は現在のコードでいくつかの問題に遭遇しています。 1つ目は、ユーザーが最初に画像をアップロードするときに、ハッシュコードがないことです。私のコードで遭遇している別の問題は、同じハッシュコードで画像をアップロードしても、画像の名前が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); 

最初の行は無用です。それを除く。それはDBに保存されたハッシュと比較する必要があるものですので、あなたではなく、新たにアップロードされたファイルのハッシュを計算する必要があります。

$hash = md5_file($tempName); 

その後、あなたはまた、新たにアップロードされたで動作するようにあなたのgetimagesizeチェックを変更する必要があります私が最初に画像をアップロードすると

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

、getimagesizeはいくつかのために呼び出されている:これは、処理する必要のあるファイルであるので、(私たちは、これが新しい、ユニークなファイルがある場合は、このチェックを取得)ファイル理由(ファイルがサーバー上にない場合でも)。また、同じ画像をもう一度アップロードすると、ハッシュ名の行があるかどうかを調べるifブロックが呼び出されません。 – user2896120

+0

最初の投稿からいくつか変更を加えました。あなたは私の最新の推奨事項で再度テストできますか? PHPが実行中に見ていることを知るために、いくつかの 'echo'や' vardump'コールをキーの場所に追加すると役に立つかもしれません。 – BeetleJuice

+0

はい、私は同じ結果を得ています。 getimagesizeの$ tempNameの代わりに$ target_fileを使用すると、正しく動作していて、初めてアップロードするときにイメージ名を変更しない – user2896120

関連する問題