2012-01-06 4 views
0

У меня есть сценарий, который загружает изображение на сервер под идентификатором пользователя. Чтобы изменить изображение, первое будет перезаписано. Проблема в том, что старое изображение с размерами нового показывается некоторое время, пока они не обновят свой браузер. Как я могу предотвратить это?Обновить изображение при загрузке

Сценарий:

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

Я не думаю, что я видел вложенное выражение, которое глубоко в течение длительного времени. Престижность. –

ответ

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

гений! Спасибо Теперь я понимаю, почему люди помещают time() в конец css-файлов в php с помощью? до – Jake

+0

Если у вас есть время, проблема в том, что он не будет кэшироваться, поэтому сайт станет медленнее. Вы действительно хотите пересмотреть, то же самое для CSS. Вы также можете указать MD5 содержимое файла, если вы не хотите использовать базу данных mysql для этого, но это может стать интенсивным вычислением. – hakre

+0

в поле редактирования, могу ли я просто поместить дату, когда она была изменена? – Jake

1

Вы могли бы дать новое изображение немного другое имя файла, так что браузер загружает новое изображение, а не использовать старый кэшированные один.

1

В вашем PHP-коде для источника изображения вы можете добавить временную метку, чтобы заставить фотографию всегда появляться в виде новой фотографии. Бросьте некоторую логику, чтобы сделать это только для обновленных записей, и вы будете более дружественными к кешу.

<img src="your_profile_url.jpg?<?= time(); ?>"/> 
Смежные вопросы