2016-07-21 33 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

相關問題