2016-07-21 34 views
0

我有一个包含图像上传和输入文本框的表单。用户将能够上传图像并输入文本,而无需使用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名称放在服务器上。我究竟做错了什么?如果有更好的解决方法,我很想知道!

+0

而不是生成一个唯一的ID,如何使用哈希像md5?这可以很容易地检测到重复:散列上传的图像,检查是否存在匹配哈希的文件名,是否存在,使用该文件,否则用散列保存图像作为文件名 – naomik

回答

0

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

+0

如果有人上传不同的图像,但是名字相同? – user2896120

+0

哈希像图像一样,只要你使用相同的算法将返回完全相同的哈希,无论名称等...这种方式,你可以比较图像,看看他们是否是完全相同的,唯一的缺点是,你将无法检测到不同的分辨率和滤镜或伽玛设置等。要做到这一点,你需要一个可以智能比较图像的ai。 – FMashiro

+0

我将如何实现散列?存储的数据库散列图像是随机字符还是随机字符? – user2896120

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这是一个文件,应存在于您的图像目录中。

+0

@ user2896120上的一列中,是否为您做了这项工作? – naomik

相关问题