检测用户是否正在上传相同的图像

时间:2016-07-21 21:01:11

标签: php ajax image mysqli

我有一个包含图片上传和输入文本框的表单。用户将能够上传图像并输入文本而无需使用Ajax刷新页面。图像将被中继到PHP,PHP将处理如何处理图像。我的问题是,用户第一次上传图像时,将检查服务器上是否有相同的图像名称。如果是,则图像名称将获得uniqid(),然后将上载。但是,如果用户更改文本框字段中的数据,但保留图像呢?然后使用uniqid()再次上传该图像,因为它已经在服务器上。我尝试使用我当前的图像处理代码来解决这个问题:

PHP

$target_file = $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/$name";
        if (isset($_SESSION["size"]))
        {
            $prevSize = $_SESSION["size"];

            if (filesize($prevSize) != filesize($size))
            {
                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";
                }
            }

        }

        else
        {
            $_SESSION["size"] = $size;

            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);

不幸的是,这段代码不能像我想要的那样工作。如果我连续两次上传相同的图像,则在同一会话中,它不会覆盖我之前的图像。相反,它将它放在具有uniqid名称的服务器上。我究竟做错了什么?如果有更好的解决方法,我很想知道!

2 个答案:

答案 0 :(得分:0)

您可以做的是每当有人上传图像,存储图像的哈希值,加密图像并将其存储在图像行的数据库中。 从现在开始,每当有人上传图片时都会运行如下查询: SELECT COUNT(*) FROM images WHERE hash = $hash然后在if语句中检查返回的值是否大于0,如果是,则执行您需要执行的操作而不重新上载图像,如果为0,则上传图像并继续< / p>

答案 1 :(得分:0)

我为此示例选择了用户头像上传。我不确定您的图像是什么,但工作流程应该类似。不会将重复的头像复制到图像路径。

function get_avatar_filename($filename) {
  // only generate an avatar filename if the mimetype matches
  switch (mime_content_type($filename)) {
    case 'image/jpeg':
      return sprintf('%s.jpg', hash_file('md5', $filename));
    case 'image/gif':
      return sprintf('%s.gif', hash_file('md5', $filename));
    case 'image/png':
      return sprintf('%s.png', hash_file('md5', $filename));

    // otherwise the user uploaded a non-supported image
    // return the default image
    default:
      return 'default-avatar.jpg';
  }
}

function upload_avatar($avatarPath, $filename) {
  // get the avatar filename
  $f = get_avatar_filename($filename);

  // copy the file to $avarPath only if the file doesn't already exist
  if (!file_exists("{$avatarPath}/{$f}")) {
    move_uploaded_file($filename, "{$avatarPath}/{$f}");
  }

  // return the avatar filename
  return $f;
}

现在,您可以在处理用户表单提交时使用这些功能

// process user form submission ...
// ...

$filename = upload_avatar(
  $_SERVER['DOCUMENT_ROOT'] . "/stories/media/images/",
  $_FILES['user_avatar']['tmp_name']
);

// save the avatar location for the user ...
// or whatever
$user->setAvatar($filename);
$user->save();

如果用户上传不受支持的图片类型,则会为他们分配default-avatar.jpg,这是一个应存在于您的图片目录中的文件。