2012-01-06 4 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

+0

배열에 어떻게 넣을 수 있습니까? – Jake

+0

오랜 시간 깊숙이 중첩 된 if 문을 본 적이 없다고 생각합니다. 명성. –

답변

2

문제는 새 사진의 크기와 함께 오래된 그림이 브라우저를 새로 고침 할 때까지 잠시 동안 표시된다는 것입니다. 어떻게 이런 일이 일어나지 않도록 할 수 있습니까?

사용자가 브라우저 캐시를 지워야한다는 사실을 알려줌으로써이를 해결할 수 있습니다.

이것이 옵션이 아닌 경우 실제로 사용자가 이미지를 캐시하지 못하도록하고 싶습니다.

그래서 이미지의 각 버전을 변경해야합니다. 이미지의 개정 번호를 저장하는 정수 필드를 데이터베이스에 추가하십시오. 그런 다음 사용자의 이미지를 출력 할 때마다 데이터베이스에서 실제 개정 번호를 가져옵니다. 이미지 URL의 쿼리 - 정보 - 일부로 추가

<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를 사용하여 PHP 파일의 끝에() 시간을 넣어 이해합니까? before – Jake

+0

시간이 오래 걸리면 캐시되지 않을 것이므로 사이트가 더 느리게됩니다. 실제로 CSS와 마찬가지로 개정판을 원합니다. 이 경우 mysql 데이터베이스를 사용하고 싶지 않으면 파일 내용을 MD5로 저장할 수 있지만 이는 컴퓨팅 집약적이 될 수 있습니다. 수정 입력란에 – hakre

+0

이 있으면 변경된 날짜를 넣을 수 있습니까? – Jake

1

당신은 새로운 이미지를 약간 다른 파일 이름을 줄 수 있습니다.

1

이미지 소스에 대한 PHP 코드에서 타임 스탬프를 추가하여 항상 사진을 새로운 사진으로 강제 표시 할 수 있습니다. 업데이트 된 레코드에 대해서만이 작업을 수행하려면 일부 로직을 던져야하며 더 많은 캐시를 사용할 수 있습니다.