Как заменять загружаемый файл каждый раз на новый файл с учётом не заменяя файлы других пользователей?

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

upd: Если сделать перезапись аву в случае одинаковых имён аватарок, то другой пользователь загрузит файл с таким же именем и перезапишет у обоих пользователей аватарку...

Controller:

public function avatar() {

  if(!$this->dx_auth->is_logged_in()) {
  show_404();
  // $this->load->helper('url_helper');
  // redirect('/', 'location');
  }

  $this->data['title'] = "Добавление аватарки";

      if($this->input->post('userSubmit')){

          //Check whether user upload picture
          if(!empty($_FILES['avatar']['name'])){
              $config['upload_path'] = 'uploads/images/';
              $config['allowed_types'] = 'jpg|jpeg|png|gif';
              // $config['file_name'] = $_FILES['avatar']['name'];
              $config['max_size'] = '50';
      $config['max_width'] = '150';
      $config['max_height'] = '150';
      $config['remove_spaces'] = TRUE;
      // $config['file_name'] = 'user_avatar';
      // $config['overwrite'] = TRUE;



              //Load upload library and initialize configuration
              $this->load->library('upload',$config);
              $this->upload->initialize($config);

              if($this->upload->do_upload('avatar')){
                  $uploadData = $this->upload->data();
                  $avatar = $uploadData['file_name'];
              }else{
                  $avatar = '';
              }
          }else{
              $avatar = '';
          }

          //Prepare array of user data
          $userData = array(
              'name' => $this->input->post('name'),
              'avatar' => $avatar
          );

          //Pass user data to model
          $insertUserData = $this->userlk_model->insertUserAvatar($userData);

          //Storing insertion status message.
          if($insertUserData){
              $this->session->set_flashdata('success_msg', 'Аватарка добавлена!');
          }else{
              $this->session->set_flashdata('error_msg', 'Какие-то проблемы с загрузкой аватарки, попробуйте ещё раз или обратитесь к администрации Retris.ru');
          }
      }

      $this->load->view('templates/header', $this->data);
      $this->load->view('userlk/avatar', $this->data);
      $this->load->view('templates/footer');
  }

Ответы (1 шт):

Автор решения: Dmitry

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

$i = 1;
$originalName = $_FILES['avatar']['name'];
$fileName = $originalName;
while ( file_exists($config['upload_path'] . $fileName ) {
  $extension = end(explode(".",$fileName));
  $fileName = basename($originalName, ".".$extension) . "_" . $i . "." . $extension;
  $i++;
}

В конце цикла, в переменной $fileName, будет содержаться уникальное имя файла, под которым его можно будет сохранить, не затрагивая другие файлы. В случае, если файла с таким же именем не существует, в переменной $fileName будет содержаться оригинальное имя. Если же файл с таким же именем уже существует, то в переменной $fileName будет содержаться имя файла в формате "ОригинальноеИмяФайла_1.расширение"

Однако, не вижу смысла сохранять файлы аватаров под оригинальным именем.

Почему бы при загрузке изображения не передавать переменную с уникальным идентификатором пользователя (ID), и не использовать шаблон для имени нового файла, например: user_ID_avatar.png?

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

→ Ссылка