私は、ユーザーがデータを入力してイメージをアップロードするフォームを持っています。このイメージは、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'");
}
}
、getimagesizeはいくつかのために呼び出されている:これは、処理する必要のあるファイルであるので、(私たちは、これが新しい、ユニークなファイルがある場合は、このチェックを取得)ファイル理由(ファイルがサーバー上にない場合でも)。また、同じ画像をもう一度アップロードすると、ハッシュ名の行があるかどうかを調べるifブロックが呼び出されません。 – user2896120
最初の投稿からいくつか変更を加えました。あなたは私の最新の推奨事項で再度テストできますか? PHPが実行中に見ていることを知るために、いくつかの 'echo'や' vardump'コールをキーの場所に追加すると役に立つかもしれません。 – BeetleJuice
はい、私は同じ結果を得ています。 getimagesizeの$ tempNameの代わりに$ target_fileを使用すると、正しく動作していて、初めてアップロードするときにイメージ名を変更しない – user2896120