2012-01-06 71 views
0

我有一個腳本,在用戶的ID下將圖像上傳到服務器。要改變圖片,首先會被覆蓋。問題在於舊圖片和新圖片的維度顯示了一段時間,直到他們刷新瀏覽器爲止。我怎樣才能防止這種情況發生?在上傳時刷新圖像

腳本:

function uploadProfilePicture($memberID,$extension) 
{ 
    ##### FIND ERRORS ##### 
    $error = ""; 

    // check if larger than 5mb 
    $avatar = $_FILES['uploadedAvatar']; 
    if($avatar["size"] > 5000000){ //5mb 
     $error = SETTINGSphoto_less_5meg; 
    } 
    //check if member selected a photo 
    if($avatar['name'] == ""){ 
     $error = SETTINGSphoto_no_upload; 
    } 

    //check if photo is of allowed formats 
    if( $avatar["type"] != "image/png" ){ 
     if( $avatar["type"] != "image/gif" ){ 
     if( $avatar["type"] != "image/jpg" ){ 
      if( $avatar["type"] != "image/jpeg" ){ 
       if( $avatar["type"] != "image/pjpeg" ){ 
        $error = SETTINGSphoto_file_type; 
       } 
      } 
     } 
     } 
    } 

    #### END FIND ERRORS #####  

    ##### DISPLAYS ERRORS ###### 
    if($error != ""){ 
      echo '<span style="background-color:#E05641;" class="pint2">'.$error.'</span>'; 
    ##### END DISPLAYS ERRORS ###### 


    ##### PROCESS THUMBNAIL AND UPLOAD PICTURE ##### 
    }else{ 



     $ext = substr($avatar["name"], -4); //take off extention. 
     $fileName = $memberID.$extension.$ext; // rename picture with member's ID.w 
     unlink("photos/".$memberID.$extension.".jpg"); 
     unlink("photos/".$memberID.$extension."Thumb.jpg"); 

     copy($avatar['tmp_name'], "photos/".$fileName); //upload temp 

     //create virual image 
     if(preg_match('/[.](jpg)$/',strtolower($avatar["name"]))) { 
      $im = imagecreatefromjpeg("photos/".$fileName); 
     } else if (preg_match('/[.](gif)$/', strtolower($avatar["name"]))) { 
      $im = imagecreatefromgif("photos/".$fileName); 
     } else if (preg_match('/[.](png)$/', strtolower($avatar["name"]))) { 
      $im = imagecreatefrompng("photos/".$fileName); 
     } else if (preg_match('/[.](jpeg)$/',strtolower($avatar["name"]))) { 
      $im = imagecreatefromjpeg("photos/".$fileName); 
     }else{ 
      $im = imagecreatefromjpeg("photos/".$fileName); 
     } 

     //get height and width 
     $ox = imagesx($im); $oy = imagesy($im); 

     $final_width_of_image = 200; 
     $final_height_of_image = 200; 
     //$ratio = $final_width_of_image/$ox; //find ratio to apply to height 
     //$nx = $final_width_of_image; $ny = $oy * $ratio; 
     if($ox < $oy){ 

       $nx = 200; 
       $ny = floor($oy * (200/$ox)); 

     }else{ 

       $ny = 200; 
       $nx = floor($ox * (200/$oy)); 

     } 


     //$nm = imagecreatetruecolor($nx, $ny); 
     //imagecopyresampled($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy); //create new pic  
     $nm = imagecreatetruecolor($nx, $ny); 
     imagecopyresampled($nm, $im, 0,0,0,0,$nx,$ny,$ox,$oy); 

     unlink("photos/".$fileName); //delete temp image 

     imagejpeg($nm, "photos/".$memberID.$extension.".jpg",100); //save image // 100 = quality 

     $im = imagecreatefromjpeg("photos/".$memberID.$extension.".jpg"); 
     $nm = imagecreatetruecolor(200, 200); 
     imagecopyresampled($nm, $im,0,0,0,0,200,200,200,200); 
     imagejpeg($nm, "photos/".$memberID.$extension."Thumb.jpg",100); 



     $sql = "UPDATE exchange SET photo = 1 WHERE id = '$memberID'"; //update db 
     $mysql = new mysql(); 
     $mysql->query($sql); 
     ##### END PROCESS THUMBNAIL AND UPLOAD PICTURE ##### 

     echo '<span class="pint2">'.SETTINGSphoto_chage_success.' <a style="color:#ffffff" href="'.$_ENV['rootURL'].'/'.(in_array($_GET['lang'],$_ENV['supportedLanguages']) ? $_GET['lang']."/" : $nothing).HEADlanguage_exchange.'/id/'.$memberID.'">'.SETTINGSphoto_view_profile.'</a></span>'; 
     } 
}  
+1

這個問題似乎是與瀏覽器緩存,我真的不知道變通的辦法,但檢查上傳的圖片類型,請你只把它們放在一個數組,並使用['in_array() '](http://php.net/manual/en/function.in-array.php) – Grexis 2012-01-06 22:01:58

+0

我怎麼能把他們在一個數組? – Jake 2012-01-06 22:05:01

+0

我不認爲我已經看到很長一段時間內嵌套的if語句。榮譽。 – 2012-01-06 22:16:59

回答

2

問題是,舊圖片與新圖片的尺寸顯示了一段時間,直到他們刷新瀏覽器爲止。我怎樣才能防止這種情況發生?

您可以通過告訴用戶她應該清除瀏覽器緩存來解決這個問題。

如果這不是一個選項,您希望實際阻止用戶緩存圖像。

因此,您需要對圖像的每個版本進行區分。將一個整數字段添加到數據庫中,以存儲圖像的修訂號。然後每次輸出用戶的圖像時,也從數據庫中獲取實際版本號。添加它作爲圖片網址的查詢信息部分:

<img src="avatars/user/929292/photo.jpg?revision"> 
             ^^^^^^^^ 

瀏覽器將仍然緩存配置文件照片,但你讓他意識到了修訂,所以具體的修訂緩存。

老頭像圖片:

<img src="avatars/user/929292/photo.jpg?1"> 

然後,用戶上傳一個新的形象,你遞增修訂領域,新的頭像圖片:

<img src="avatars/user/929292/photo.jpg?2"> 

如果修訂變化,瀏覽器的通知並且將從服務器中選取圖像。

+0

天才!謝謝現在我明白了爲什麼人們把時間()放在php的css文件的末尾?之前 – Jake 2012-01-06 22:12:57

+0

如果你花時間有問題,它不會被緩存,所以網站變得更慢。你實際上想要修改,CSS也一樣。如果你不想爲此使用mysql數據庫,那麼你也可以將MD5作爲文件內容,但這可能會變成計算密集型的。 – hakre 2012-01-06 22:15:24

+0

在修訂領域,我可以只是把它改變的日期? – Jake 2012-01-06 22:31:16

1

你可以給新的圖像略有不同的文件名,這樣瀏覽器加載新的圖像,而不是使用舊的緩存之一。

1

在圖像源的PHP代碼中,您可以附加時間戳來強制照片始終顯示爲新照片。拋出一些邏輯,只爲更新的記錄執行此操作,並且您將更容易緩存。

<img src="your_profile_url.jpg?<?= time(); ?>"/>